IP头部结构

IP头部结构图如下
在这里插入图片描述

注意:一行32bit为4字节,扩展的时候总是一行一行的拓展,也就是4个字节4个字节的扩展

版本号(Version):长度4bit,标识目前采用的IP协议的版本号,一般的值0100(IPv4),0110(IPv6)

首部长度(Header Length):长度4bit,这个字段的作用是为了描述IP头部的长度,IP头部长度是可变的(最常用的是红框中的部分,一共占20字节)。

- 首部长度部分占4个bit位,取值范围是0-15,单位为32bit(4个字节)
- 整个IP头部占空间大小=首部长度值*4(单位/字节)

- 所以可变的IP头部的大小最大为60字节:15*4=60

- 一般使用的是5行,每行4字节,5*4=20字节

服务类型(Type of Service):长度8bit, 按位被如下定义,包括3bit的优先权字段(000-111),4 bit的TOS字段,1 bit未用位但必须置0。

01234567
PPPDTCR0

PPP:定义包的优先级,取值越大数据越重要

000Routine(普通)
001Priority(优先)
010Immediate(快速)
011Flash(闪速)
100Flash Override(疾速)
101Internetwork Control(网间控制)
110Network Control(网络控制)
111Critic(关键)
- 优先级0为默认标记值。
- 优先级12给数据业务使用。
- 优先级3给语音控制数据使用。
- 优先级4由视频会议和视频流使用。
- 优先级5推荐给语音数据使用。
- 优先级67一般保留给网络控制数据使用,如路由。

注意:在标记数据时,既可以使用数值,也可以使用名称(英文名称)。
TOS字段01
D 时延普通延迟尽量小
T 吞吐量普通流量尽量大
R 可靠性普通可靠性尽量大
M 传输成本普通成本尽量小
- TOS字段的4 bit中只能置其中1 bit,可以都为0,如果所有4 bit均为0,那么就意味着是一般服务。
- 举例:
	- 网络视屏要求最小的传输时延。
	- 文件传输要求最大吞吐量
	- 网络管理和路由要求高可靠性。
	- 用户网络新闻要求最小费用。

IP包总长(Total Length):长度16bit,以字节为单位。

IP包=IP头部+数据
IP包最大长度65535字节

标志(Flags):长度3bit,是一个3位的控制字段

012
不使用DF(Don’t Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1
- 保留位:1- 不分段位:1位,取值:0(允许数据报分段)、1(数据报不能分段)
- 更多段位:1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)

- 举例:
	- 如果分数据包分两段:
		- 第一个的Flags为:101
		- 第二个Flags就为:100

段偏移量(Fragment Offset):长度13bit,表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。

生存时间(TTL):长度8bit,当IP包进行传送时,先会对该字段赋予某个特定的值,当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1,如果TTL减少为0,则该IP包会被丢弃,这个字段可以防止由于路由环路而导致IP包在网络中不停被转发

协议(Protocol):长度8bit,标识了上层所使用的协议,以下是比较常用的协议号:

1ICMP
2IGMP
6TCP
17UDP
88IGRP
89OSPF

头部校验(Header Checksum):长度16bit,用来做IP头部的正确性检测,不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。

源和目标地址(Source and Destination Addresses):这两个地段都是32bit,标识了这个IP包的起源和目的地址(源IP地址指的就是发送数据包的那个电脑的IP地址,目的IP地址就是想要发送到的那个电脑的IP地址),要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。

至此,IP包头基本的20字节已介绍完毕,此后部分属于可选项,不是必须的部分。

可选项(Options):这是一个可变长的字段,该字段属于可选项,主要用于测试,由起源设备根据需要改写,可选项目包含以下内容:

  • 松散源路由(Loose source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。

  • 严格源路由(Strict source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,如果下一跳不在IP地址表中则表示发生错误。

  • 路由记录(Record route):当IP包离开每个路由器的时候记录路由器的出站接口的IP地址。

  • 时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。

  • 填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。

TCP头部结构

在这里插入图片描述
源端口号:16bit,发送方的端口号。

目标端口号:16bit,接收方的端口号。

32为序列号(sequence number):保证网络传输数据的顺序性。

32位确认号(acknowledgment number):用来确认确实有收到相关数据包,内容表示期望收到下一个报文的序列号,用来解决丢包的问题。

头部大小:4bit,标识该tcp头部有多少个32bit字(4字节)因为4位最大能表示15,所以tcp头部最长是60字节

保留位 :6位 ,预留字段,都为0。

6位标志位:标志位有如下几项

URG表示紧急指针是否有效
ACK标志表示确认号是否有效
PSH标志提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为接受后续数据腾出空间(如果应用程序不将接收的数据读走,它们就会一直停留在tcp缓冲区中)
RST标志表示要求对方重新建立连接。携带RST标志的tcp报文段为复位报文段
SYN标志表示请求建立一个连接。携带SYN标志的tcp报文段为同步报文段
FIN标志表示通知对方本端要关闭连接了。携带FIN标志的tcp报文段为结束报文段

16位窗口大小:占16bit,此字段用来进行流量控制,主要用于解决流控拥塞的问题。单位为字节数,这个值是本机期望一次接收的字节数。

16位校验值: 占16bit。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。

16位紧急指针:占16bit,它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

32位Tcp选项:一般包含在三次握手中。

UDP头部结构

在这里插入图片描述
UDP的头部相当于TCP的头部来说比较简单,有8个字节(每个字节8bit)构成,8个字节包含4个字段,其中每个字段都是两个字节

源端口号:16bit,发送方的端口号(主机的应用程序使用的端口号)。

目标端口号:16bit,接收方的端口号(目的主机的应用程序使用的端口号)。

16位总长度:是指UDP头部UDP数据加在一起的字节长度,因为UDP头 部长度为8字节,所以该字段的最小值为8。

16位校验和:检测UDP数据报在传输中是否有错,有错则丢弃。

TCP和UDP的区别

通过分析前面的TCP头部和UDP头部,就可以知道:

用户数据报协议 UDP(User Datagram Protocol)

  • 是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。

传输控制协议 TCP(Transmission Control Protocol)

  • 是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。

MAC地址、IP地址、端口号

在利用TCP/IP协议族进行通信的时候,有三个比较关键的确认身份的信息:MAC地址、IP地址和端口号。

在OSI 模型中,第三层网络层负责 IP 地址,第二层数据链路层则负责 MAC 地址,因此一个主机会有一个 MAC 地址,而每个网络会有一个专属于它的 IP 地址。

MAC地址

  • 数据链路层包裹在以太网头部中的,它主要用来识别同一个链路中的不同计算机。
  • MAC地址即网卡号,每块网卡出厂的时候,都有一个全世界独一无二的 MAC 地址,长度是 48 个二进制位,通常用 12 个十六进制数表示。

IP地址

  • IP地址是由网络地址主机地址组成
  • 网络层的IP头部里,用于识别网络中互联的主机和子网(例如:路由器连接外网,同一个路由器下的所有设备组成子网),通过网络地址确认所在的子网,在子网内部通过MAC地址确认主机地址。

端口号

  • 传输层包含在TCP/UDP头部中的,用于识别应用程序。

  • 一台主机上能运行多个程序,那么接收到的消息到底是哪个程序的呢?就需要端口号来确认。

  • 端口号有两种:

    • 固定的端口号:是形如http,telnet,ftp等广为使用的应用协议所使用的端口号是固定的
    • 动态分配的端口号:这个时候服务端要确定监听端口号,接受服务的客户端没必要确定端口号
    • 端口号由传输层协议决定,因此不同传输协议可以使用相同的端口号,所以TCP和UDP可以使用同一个端口号

数据传输过程图解

在这里插入图片描述
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐