TCP协议介绍

=====================【TCP协议】====================
TCP 中的Sequence Number : https://www.cnblogs.com/JenningsMao/p/9487252.html
理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number): https://blog.csdn.net/a19881029/article/details/38091243
Wireshark抓包分析TCP协议: https://www.cnblogs.com/jiangzhaowei/p/7998515.html
为什么需要三次握手,四次挥手:https://www.cnblogs.com/freebrid/p/4700717.html //这个解释得很好

 

TCP传输中,每一个字节都是有序号的。从0开始。通过序号的方式保存数据的顺序。
接收端接受到之后进行重新排列成为需要的数据。

 

SEQ 代表:发送的这个包中第一个字节(如果有payload的话)的序号。
ACK 代表:已成功接受序列号到 ack-1 的数据,期望接收的下一个字节的序号为 ack。

 

细心的同学可能会发现,为什么在建立连接的时候,发送的 SYN 包大小(payload)明明是0字节,但是接收端却返回 ACK = 1 ,还有断开连接的时候 FIN 包也被视为含有1字节的数据。
原因是 SYN 和 FIN 信号都是需要 acknowledgement 的,也就是你必须回复这个信号,如果它不占有一个字节的话,要如何判断你是回复这个信号还是回复这个信号之前的包呢?
例如:如果 FIN 信号不占用一个字节,回复 FIN 的 ack 包就可能被误认为是回复之前的数据包被重新发送了一次,第二次挥手无法完成,连接也就无法正常关闭了。

序列号为当前端成功发送的数据位数,确认号为当前端成功接收的数据位数,SYN标志位和FIN标志位也要占1位;

 

MTU:最大传输单元,在TCP/IP协议族中,指的是IP数据报能经过一个物理网络的最大报文长度,其中包括了IP首部(从20个字节到60个字节不等),
一般以太网的MTU设为1500字节,加上以太帧首部的长度14字节,也就是一个以太帧不会超过1500+14 = 1514字节。

MSS:最大报文段大小,指的是TCP报文(一种IP协议的上层协议)的最大数据报长度,其中不包括TCP首部长度。MSS由TCP链接的过程中由双方协商得出,其中SYN字段中的选项部分包括了这个信息。
如果MSS+TCP首部+IP首部大于MTU,那么IP报文就会存在分片,如果小于,那么就可以不需要分片正常发送。

 

偏移(4bit):
表示有几个4字节;若此字段的值为0x1000,则说明TCP首部的长度是8 * 4 = 32字节;
TCP首部的最大长度是该字段的值为0x1111 = 15, 15 * 4 =60字节;

6个标志位:
URG(Urgent Pointer Field Significant):紧急指针标志,用来保证TCP连接不被中断,并且督促中间设备尽快处理这些数据
ACK(Acknowledgement Field Signigicant):确认号字段,该字段为1时表示应答字段有效,即TCP应答号将包含在TCP报文中。
PSH(Push Function): 推送功能,所谓推送功能指的是接收端在接收到数据后立即推送给应用程序,而不是在缓冲区中排队。
RST(Reset the connection): 重置连接,不过一搬表示断开一个连接,如下图,主机192.168.3.27 访问主机211.150.84.8;但主机84.8并没有监听对于端口,这时它会向主机3.27发送一个RST位置的TCP包断开连接。
SYN(Synchronize sequence numbers):同步序列号,用来发起一个连接请求。
FIN(No more data from sender):表示发送端发送任务已经完成(既断开连接)。

 

窗口大小:
源主机最多能接收多少个字节;

校验和:
包含TCP首部和TCP数据报;强制性字段,由发送端计算和存储,由接收端进行验证;

紧急指针:
URG=1时有效,紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一段发送紧急数据的一种方式。

TCP选项
至少1个字节的可变长字段,标识哪个选项有效。Kind=0:选项表结束, Kind=1:无操作, Kind=2:最大报文段长度,Kind=3:窗口扩大因子, Kind=8:时间戳。

三次握手,四次挥手;

为什么需要三次握手:
主要目的防止server端一直等待,浪费资源。

四次挥手:
TCP是全双工通信;
A主动发起断开连接,需要告诉B。
B收到断开连接消息,马上回了消息:知道了,但是没有立即断开,因为需要发送完没发完的数据。
等B发完数据后,由回了消息:断开连接;
A收到B的知道了,还不能进入关闭状态,因为要等B的消息:断开连接;
A收到B的断开连接消息,就可以进入关闭状态了,但是同时也要告诉B一声,收到断开连接消息。
B收到A的断开连接消息能确认A已经关闭了,于是自己也关闭了。

posted @ 2021-04-12 00:04  Grooovvve  阅读(80)  评论(0编辑  收藏  举报