大家好,又见面了,我是你们的朋友全栈君。
源端口(2字节):发送端应用程序的端口号,与源IP地址确定一个唯一地址
目的端口(2字节):接收端计算机应用程序的端口号,与目的IP地址确定唯一的地址
序号(4字节):TCP是面向字节流传输的,他为每一个字节编了一个序号,该报文段中序号为传输数据第一个字节的序号,例如:一个报文端的数据部分大小为100个字节,他的序号为400,那么下一次报文段的序号就为500
确认号(4个字节):指明了下一个期待接收的字节序号,表明该序号之前的所有字节都正确接收到了,只有当ACK为1的时候确认号才有效
数据偏移/首部长度(4个字节): 用来表示报文段数据的起始处距离报文起始处的长度也就是TCP报文首部的长度,由于首部含有可选项,所以TCP报头长度是不确定的。
保留:为了将来定义新的用途保留,现在一般都置为0
URG紧急控制位:与紧急指针配合使用,当URG为1的时候,就是通知系统这个报文段有紧急数据,需要优先传输。
ACK确认控制位:当他为1的时候,确认号字段才有效,TCP规定,在连接建立后,所有ACK都应该置为1
PSH推送控制位:当报文段的psh为1的时候,接收方接到该报文段,就立刻将他交付给接收应用进程,而不是等缓存已满的时候再交付。
RST复位控制位:当报文段的RST为1的时候,说明该TCP连接出现错误,必须释放连接,并重新建立连接。
SYN同步控制位:在连接建立时用来同步序列号,当SYN=1,ACK=0时说明这是一个连接请求报文段,如果对方同意建立连接则应该在响应的报文段中将SYN=1,ACK=1,表示接受请求
FIN终止控制位:用来释放连接,当FIN=1时表示此报文段发送方的数据已经发送完毕,并要求释放连接。
窗口(2字节):用来告知发送端,接收端的缓存大小,以此控制发送方发送数据的速率,从而达到流量控制,窗口最大为65536
校验和:用CRC来校验整个TCP报文段,包括tcp头,tcp数据,由发送端进行计算和存储,接收端进行校验,如果接收方发现校验和有差错,则TCP段会被直接丢弃
紧急指针(2字节):标识紧急数据在报文段结束的位置
选项(40字节):长度可变,最大长度40个字节,
选项部分的应用
MSS最大报文段长度(Maxium Segment Size):指明自己期望对方发送数据字段的最大长度,如果未填写默认为536个字节,他只出现在SYN=1的报文段中。
窗口扩大选项:当出现宽带比较大的通信的时候,就需要扩大窗口来满足性能和吞吐量
SACK选择确认项(Selective Acknowledgements):为了确保重传的时候只传丢失的那部分报文段,而不重传所有的报文段,最多能描述4个丢失的报文
时间戳选项(Timestamps):使用该字段就很容易区分相同序列号的不同报文段(回绕序列号),还可以计算RTT(往返时间),当发送端发送一个报文段的时候把当前时间放入这个时间戳选项,当接收方收到后将其复制到确认报文段,发送方接收到这个确认报文段后就可以计算往返时间了。
NOP(NO-Operation):指明选项部分的每种选项长度必须是4字节的倍数,不足时用NOP补充,同时他还可以用来分割不同的选项字段。
数据部分:该部分可选,列如,在一个链接建立和终止的时候,双方发送的报文段只有首部
补充:回绕序号带来的影响:这个问题只会发生在相对高速的连接中,由于序列号的长度为32为所以当序列号超过2^32-1时就会重置为0,此时就会产生回绕序列号
假设A时间段的序列号为10,B时间段的序列号也为10,当A时间段的报文段延迟了,他会重传解决,而延迟的报文段的丢失与重出现的时间小于报文段在网络中的最大生存时间,他存活下来并发送到了B的接收端,此时B就蒙了,一下来了两个报文段(正常的+重传的),不知道该接收那个
参考:https://www.cnblogs.com/a294098789/p/5656120.html
https://blog.csdn.net/mary19920410/article/details/58030147
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126957.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...