20个字节的固定首部
数据偏移:占四位,乘以四就是首部的长度,取值范围0x101—0x1111,20—60,和UDP一样
保留:占6位,暂时没有什么用,全为0
序号:占四个字节,首先,传输的每一个字节都有一个编号,而且连续的字节编号都是连续的,在建立连接后,
序号:代表这一次传给对方的TCP数据部分的第一个字节的编号
确认号:占四个字节,在建立连接后,确认号代表期望下一次传过来的TCP数据部分的第一个字节编号
**窗口:**占两个字节,这个字段有流量控制功能,用以告知对方下一次允许发送的数据大小
图片的标志位[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bCnn8cDO-1637504928549)(D:Desktop计算机网络第八天:TCP—可靠传输.assetsimage-20211008185648520.png)]
URG:当URG=1时,紧急指针字段才有效。表明当前报文段由紧急数据,应优先传输,一般情况都是0 ACK:当ACK为1时,确认号才有用 PSH:用不上 RST:当RST=1时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接如图,当出现这样的情况,说明断开重连了
SYN(同步):当SYN=1、ACK=0,表明这是一个建立连接的请求,当对方同意建立连接,则回复,SYN、ACK都置为1 FIN:FIN为1,代表发送完毕紧急指针
为什么TCP的头这么复杂?
因为它要保证可靠传输、流量控制、拥塞控制
tcp的一个细节
UDP的首部中有一个16位的字段记录了整个UDP报文段的长度(首部+数据),但是TCP的首部中仅仅有个四位的字段记录了TCP的首部长度,并没有记录TCP报文段的数据长度
为什么?
因为能够推测出来
UDP首位中占16位的长度字段时冗余的,纯粹为了保证首部时32bit对齐
TCPUDP的数据长度,完全可以由IP数据包的首部推测出来
传输层的数据长度=网络层的总长度-网络层的首部长度-传输层的首部长度
TCP—校验和跟UDP一样,TCP校验和的计算内容:伪首部+首部+数据
伪首部:占用12个字节,仅在计算校验和时起作用,并不会传递给网络层
可靠传输当我们传输的数据很大时,我们会把数据切割成很多块,当数据传输过程中丢失后,TCP能保证再发给它
停止等待ARQ(automatic Repeat-reQuest)协议ARQ(automatic Repeat-reQuest)自动重传请求
无差错情况:当A发送M1数据包后,B收到后就给A一个响应,A再发送M2数据包,B再给A一个响应,A再发送M3数据包,B确认后再给A一个响应数据包
超时重传:当A发送一个M1数据包,B接受后发现M1数据包有丢失,B就不给A响应,当到达一定时间后,A重新发送M1数据包
确认丢失:当A发送M1数据包时,B也收到了完整的数据包M1,但是再回传的时候丢失,A继续等待,当A等待一定时间后,A重传M1数据包,B收到后丢掉之前的M1,重新确认M1
确认迟到:A发送数据包M1,B收到M1后发送给A确认,但是M1的确认迟到了,结果A认为超时了,重新发送M1数据包,B再回传,当收到信回传的M1确认信息后,之前迟到的M1信息又收到了,但是A什么也不处理
通过这样的方式确实能够实现,但是传输效率很慢,加入我有10个数据包,发送一个要1s,那我发送数据包就要10s,很慢,于是就出现了新的协议
连续ARQ协议+滑动窗口协议 假如我有8个数据包,我一口气发送四个数据包过去,当确认送到了,我只回传M4的确认信息,因为M4都收到了,证明M1、M2、M3都收到了
窗口协议 SACK(选择性确认)在TCP通信过程中,如果发送序列中间某个数据包丢失(比如1,2,3,4中的3丢失了)
TCP会通过重传最后确认的分组的后续分组
这样原先已经正确传输的分组也可以重复发送,减低了TCP性能
为了改善这样的情况,于是就出现了SACK技术,它可以准确的告诉发送方哪些数据丢失,哪些数据已经提前收到
SACK占用的部分
一对边界信息需要占用8个字节,由于TCP首部选用字节最多40个字节,所以SACK选项最多携带四组边界信息,SACK选项的最大占用字节数=4*8+2=34,为什么要+2,因为还需要kind、length两个字节刚需



