概述
TCP Header
- 16位端口号:源端口和目的端口各占16位,2的16次方等于65536,看端口的命令:netstat。
- 序列号:字段长32位,表示发送数据的位置,每发送一次数据,就累加一次该数据字节数的大小。序列号不会从0或1开始,而是在建立连接时生成的随机数作为其初始值,通过SYN包传给接收端。然后再将每次转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但也作为一个字节增加对应的序列号。
- 字长32位表示下一次应该收到的数据的序列号。在此保证确认号之前的数据都被确认。
- 4字长数据偏移:该字段表示TCP传输数据包的位置从哪个TCP包开始计算。
- 四字节保留字段:作为有扩展使用;
- 字长8位的控制位:依次为CWR、ECE、URG、ACK、PSH、RST、SYN、FIN
CWR和ECE都用于IP首部的ECN字段,当ECE字段为1是,通知对方,拥塞窗口已缩小。
URG标志为1表示该部分为紧急事件,做进一步处理。
ACK标志位1表示确认应答的字段有效。
PSH位为1则将接收到的数据立即发送给上层协议,为0则先缓存,缓冲区满在发送给上层协议。
RST为1是表示连接异常必须强制中断。
SYN为1表示希望建立连接,进行序列号初始值设定;连接过程是一个确认应答号和序列号同步的过程。
FIN为1表示之后不会再有数据发送,发送端完成发送,希望断开连接;每个主机对对方的FIN包进行确认应答后就断开连接。
- 16位窗口大小;指的是从确认应答号所在报文位置开始能够接收的数据大小(8位);如果窗口大小为0,表示可以发送窗口探测。
- 校验和:TCP校验和计算的作用是判断协议首部和数据是否被破坏。TCP在计算校验和的时候使用TCP伪首部。为了使其全长为16位的整数倍,需要在数据部分的最后填充0。首先将TCP校验和字段设置为0,然后以16位为单位进行1的补码和计算,再将他们的总和的1的补码和放入校验和字段。 接收端在收到TCP数据段以后,从IP首部获取IP地址信息构造TCP伪首部,再进行校验和计算。由于校验和字段里保存着除本字段以外其他部分的和的补码值,因此如果计算校验和字段在内的所有数据的16位和以后,得出的结果是“16为全部为1”,说明所收到的数据是正确的。
- 紧急指针:字段长16位,只在URG控制位为1时有效。该字段的数值表示本报文段中紧急数据的指针。从数据部分的首位到紧急指针所指示的位置为止为紧急数据。因此,也可以说紧急指针指出了紧急数据的末尾在报文段中的位置。处理紧急数据属于应用层的问题,一般在暂时中断通信,或中断通信的情况下使用。此外,紧急指针也用作表示数据流分段的标志。
UDP Header
- UDP长度字段:指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节(发送一份0字节的UDP数据报是OK)。这个UDP长度是有冗余的。IP数据报长度指的是数据报全长,因此UDP数据报长度是全长减去IP首部的长度。
- UDP检验和:覆盖UDP首部和UDP数据。UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。它可以保证UDP数据被正确的主机收到了。因在校验和中加入了伪头标,故ICMP除能防止单纯数据差错之外,对IP分组也具有保护作用(和TCP不同的是,对UDP来说,此字段是可选项,而TCP数据段中的校验和字段是必须有的
- 将UDP封装成IP数据包
UDP是一种不可靠的、无连接的数据报服务。源主机在传送数据前不需要和目标主机建立连接。数据被冠以源、目标端口号等UDP报头字段后直接发往目的主机。这时,每个数据段的可靠性依靠上层协议来保证。在传送数据较少、较小的情况下,UDP比TCP更加高效。
IP Header
- IPv4的头部结构长度为20字节,若含有可变长的选项部分,最多60字节
- 4位版本号:IP协议(IPv4)版本号位4
- 4位头部长度:最大共15*4个字节
- 8位服务类型(Type Of Service,TOS):包含一个4位优先权字段:最小延时,最大吞吐量,最高可靠性和最小费用。
- 16位总长度:表示整个IP数据报的长度,最大表示65535,但由于MTU限制,一般无法到达这个值,长度超过MTU的数据报都将被分片传输,所以实际传输的IP分片数据报的长度远远没有达到最大值。
下面的三个字段实现分片:16位标识、3位标志、13位片偏移
- 16位标识:唯一的标识数据报,其初始值是随机的,每发送一个数据报其值就加1。同一个数据报的所有分片都具有相同的标识值
- 3位标志(1保留,2-DF禁止分片,3-MF更多分片):所以这个标志是为分片存在,DF设置时禁止分片,所以如果数据报太大则发送失败(返回一个ICMP差错报文)。MF设置时,如果产生分片,除了最后一个分片,其他分片置1。
- 13位分片偏移:分片相对原始IP数据报开始处的偏移。
- 8位生存时间(TTL):数据报到达目的地之前允许经过的路由跳数。跳一下减1,当TTL值为0时,路由器就将该数据包丢弃,并向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环
- 8位协议:用来区分上层协议(ICMP为1,TCP为6,UDP为17)。
- 16位头部校验和:仅以CRC算法检验数据报头部在传输过程中是否损坏。
- 32位源端口、IP地址、目的端口、目的地址
- 选项(可变长):
a. 记录路由: 记录数据包途径的所有路由的IP,这样可以追踪数据包的传递路径
b. 时间戳: 记录每个路由器数据报被转发的时间或者时间与IP地址对,这样就可以测量途径路由之间数据报的传输的时间
c. 松散路由选择: 指定路由器的IP地址列表数据发送过程中必须经过所有的路由器
d. 严格路由选择: 数据包只能经过被指定的IP地址列表的路由器
e. 上层协议(如TCP/UDP)的头部信息
最后
以上就是高贵小天鹅为你收集整理的TCP Header、UDP Header、IP Header的全部内容,希望文章能够帮你解决TCP Header、UDP Header、IP Header所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复