TCP与UDP报文头格式

TCP和UDP是我们经常使用的数据传输协议

首先我们需要知道报文的封装结构
报文封装结构

1 TCP报文头部

TCP是一个面向连接的、可靠的、字节流传输协议。
TCP报文封装在IP报文中的时候,TCP头紧接着IP头。
不携带选项的TCP头长20bytes,携带选项的TCP头最长可达60bytes。
TCP报文
其中header length字段由4比特构成,最大为15,单位是32比特(32-bit word),即头长的最大值为15*32 bits = 60bytes,因此上面说携带选项的TCP头长最长为60bytes,基本的不携带参数的只有20byte
下面看到的options选项是省略了可能携带的10行10x32bit= 40byte
TCP报文可选字段

1.1 相关字段解释

源端口: 发送端应用程序的端口号(16bit)
目的端口:接收端的端口号
源ip和目的ip不在tcp报文里面,在ip报文里面。
序列号(SN):32位的序列号标志TCP报文中第一个byte在对应方向的传输中对应的字节序号。也叫作SEQ
确认号:ACK
头长:4bit,包括TCP头大小,指示TCP头的长度,数据从何处开始,最大为15,单位是32bit。
保留:4bit,默认是0.
标记:8个标记位
窗口大小:16位,指示从Ack Number开始还愿意接收多少byte的数据了,当前接收端的接收窗还有多少剩余空间。用于TCP的流量控制
校验和:16位。发送端基于数据内容计算一个数值,接收端要与发送端数值结果完全一致,才能证明数据的有效性。
紧急指针:指向后面是优先数据的字节。
option:最大长度是10*32,必须是32的倍数

1.1.1 关于八位标记位

这段直接摘抄自:https://www.cnblogs.com/lshs/p/6038458.html
CWR(Congestion Window Reduce):拥塞窗口减少标志被发送主机设置,用来表明它接收到了设置ECE标志的TCP包,发送端通过降低发送窗口的大小来降低发送速率
ECE(ECN Echo):ECN响应标志被用来在TCP3次握手时表明一个TCP端是具备ECN功能的,并且表明接收到的TCP包的IP头部的ECN被设置为11。更多信息请参考RFC793。
URG(Urgent):该标志位置位表示紧急(The urgent pointer) 标志有效。该标志位目前已经很少使用参考后面流量控制和窗口管理部分的介绍。
ACK(Acknowledgment):取值1代表Acknowledgment Number字段有效,这是一个确认的TCP包,取值0则不是确认包。后续文章介绍中当ACK标志位有效的时候我们称呼这个包为ACK包,使 用大写的ACK称呼。
PSH(Push):该标志置位时,一般是表示发送端缓存中已经没有待发送的数据,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接 时,该标志总是置位的。
RST(Reset):用于复位相应的TCP连接。通常在发生异常或者错误的时候会触发复位TCP连接。
SYN(Synchronize):同步序列编号(Synchronize Sequence Numbers)有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。类似的后续文章介绍中当这个SYN标志位有效的时候我们称呼这个包为SYN包。
FIN(Finish):带有该标志置位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。当FIN标志有效的时候我们称呼这个包为FIN包

另外我们一般称呼链路层的发出去的数据包为(frame),称呼网络层发给链路层的数据包为(packet),称呼传输层发给网络层的数据包为(segment)。但是正如我们描述所用,段、包、帧也经常统称为数据包或者数据报文

2 UDP报文头

UDP报文头
源端口:长度为16位,2个字节。
目的端口:长度为16位,2个字节。
总长度:长度为16位,2个字节,表示 UDP包头长度 和 数据长度之和。
校验和:长度为16位,2个字节。
由上述的UDP报文格式可以知道,UDP包头的长度为8个字节。

3 IP头部

IP数据报
IP数据包也叫IP报文分组,传输在ISO网络7层结构中的网络层,它由IP报文头和IP报文用户数据组成,IP报文头的长度一般在20到60个字节之间,而一个IP分组的最大长度则不能超过65535个字节。所以IP报其实与TCP的差不多,基本长度都是20byte,最长是60。

3.1 IP报头参数

版本:占4位(bit),指IP协议的版本号。目前的主要版本为IPV4,即第4版本号,也有一些教育网和科研机构在使用IPV6。在进行通信时,通信双方的IP协议版本号必须一致,否则无法直接通信。
首部长度:占4位(bit),指IP报文头的长度。最大的长度(即4个bit都为1时)为15个长度单位,每个长度单位为4字节(TCP/IP标准,DoubleWord),所以IP协议报文头的最大长度为60个字节,最短为上图所示的20个字节。
服务类型:占8位(bit),用来获得更好的服务。其中的前3位表示报文的优先级,后面的几位分别表示要求更低时延、更高的吞吐量、更高的可靠性、更低的路由代价等。对应位为1即有相应要求,为0则不要求。
总长度:16位(bit),指报文的总长度。注意这里的单位为字节,而不是4字节,所以一个IP报文的的最大长度为65535个字节。
标识(identification):该字段标记当前分片为第几个分片,在数据报重组时很有用。
标志(flag):该字段用于标记该报文是否为分片(有一些可能不需要分片,或不希望分片),后面是否还有分片(是否是最后一个分片)。
片偏移:指当前分片在原数据报(分片前的数据报)中相对于用户数据字段的偏移量,即在原数据报中的相对位置。
生存时间:TTL(Time to Live)。该字段表明当前报文还能生存多久。每经过1ms或者一个网关,TTL的值自动减1,当生存时间为0时,报文将被认为目的主机不可到达而丢弃。 使用过Ping 命令的用户应该有印象,在windows中输入ping命令,在返回的结果中即有TTL的数值。
协议:该字段指出在上层(网络7层结构或TCP/IP的传输层)使用的协议,可能的协议有UDP、TCP、ICMP、IGMP、IGP等。
首部校验和:用于检验IP报文头部在传播的过程中是否出错,主要校验报文头中是否有某一个或几个bit被污染或修改了。
源IP地址:32位(bit),4个字节,每一个字节为0~255之间的整数,及我们日常见到的IP地址格式。
目的IP地址:32位(bit),4个字节,每一个字节为0~255之间的整数,及我们日常见到的IP地址格式
http://www.rosoo.net/a/201409/17083.html