1.TCP报文格式
源端口号: 占用16位
,报文来自哪个端口。
目的端口号: 占用16位
,报文要传输到哪个端口。
Seq序列号: 占用32位
,一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025.另外一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义。
Ack确认序列号: 占用32位
,用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且包含对B发送来的TCP报文段的确认号。反之,B发送出的TCP报文段也同时携带自己的序号和对A发送来的报文段的确认号。
头长度: 占用4位
,标识该TCP头部有多少个字节。因为4位最大能标识15,所以TCP头部最长是60字节。
保留位: 占用6位
,很少使用,一般为0。
控制位: URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能;
标志位(占用1位) | 功能 |
---|---|
URG | 紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。 |
ACK | 确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。 |
PSH | push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。 |
RST | 重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。 |
SYN | 同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。 |
FIN | finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。 |
窗口: 占用16位
,滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
校验和: 占用16位
,奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
紧急指针: 占用16位
,只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项和填充: 最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
2.UDP报文格式
源端口号: 占用16位
,报文来自哪个端口。
目的端口号: 占用16位
,报文要传输到哪个端口。
UDP长度: 占用16位
,UDP报文的字节长度(包括首部和数据)。
校验和: 占用16位
,检验UDP首部和数据部分的正确性。