传输控制协议(TCP ,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
1.TCP头部格式
- 源/目的端口:表示数据从哪个进程发送,然后发送到哪个进程去
- 32位序列号:发送的数据按照一个字节一个编号存放进去
- 32位确认号:用于给与对方响应,值为收到的TCP报文的序号值加1(表示对当前应答报文针对的消息进行确认的应答)
- 4位TCP报头长度:表示TCP头部有四个字节(32位),TCP最大长度为60
- 8个boolean值标志位
CWR:拥塞窗口减少标志被发送主机设置,用来表明它接收到了设置ECE标志的TCP包
ECE:ECN响应标志被用来在TCP三次握手时表明一个TCP端是具备ECN功能的,并且表明接收到的TCP包的IP头部的ECN被设置为11。
URG:此标志表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据。
ACK:此标志符表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有俩个取值:0和1,为1的时候表示应答域有效,反之为0。
PSH:这个标志位表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区排队。
RST:这个标志表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包。
SYN:表示同步序列号,用来建立连接。
FIN:表示发送端已经到达数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。
- 16位窗口大小:进行流量窗口控制
- 16位校验和:检验数据是否一致
-
16位紧急指针:标识哪部分数据是紧急数据
2.TCP协议原理
TCP协议是对数据传输提供的一个管控机制,主要体现在可靠和效率俩个方面,即在保证数据可靠传输的情况下尽可能的提高效率
2.1可靠传输机制
2.1.1确认应答机制
向对方发送一个数据报文,对方要返回一个确认应答的报文
实现的方式:序列和确认序列号保证了响应应答针对的是哪一条消息的应答
说明:
- 发送的数据是基于TCP报头中的“32位序列号”来保存的,一个字节对应一个序号
- 确认应答的数据是基于TCP报头中的“32位确认序列号”来保存的,ACK标志位置为1,返回某个序列号,说明某个序列号之前的数据全部接收到
- 有了确认应答,它才可以继续发送后边的数据
2.1.2超时重传机制
发送的数据报文可能因为网络拥堵等原因。超过一定时间,还没有收到确认应答的数据报文,就需要重新发送。
2.2.3连接管理机制(三次握手,四次挥手)
真正发送数据前,要先通过三次握手建立连接,不需要在发送数据了,通过四次挥手断开连接
三次握手
- 客户端向服务端发送SYN,申请建立客户端到服务器的连接
- 服务端返回ACK(第一次SYN的应答)和SYN,申请建立服务端到客户端的连接
- 客户端收到数据,状态变为ESTABLISHED,表示客户端到服务端连接建立完成,并且发送ACK(第二次SYN的应答),服务端收到数据,状态变为ESTABLISHED,表示服务端到客户端的连接建立完成
三次握手主要是为了检查当前网络的情况石佛满足可靠运输的基本条件,同时也是在检测双方发送和接收数据的能力是否正常
四次挥手
说明:关闭的时候服务端申请关闭或者客户端申请关闭都可以
- 客户端发送FIN到服务端,申请关闭客户端到服务端的连接
- 服务端收到FIN状态变为CLOSE_WAIT,并返回ACK应答(这个动作是系统实现TCP协议栈默认执行的不需要程序来调用代码)
- 服务端发送FIN到客户端,申请关闭服务端到客户端的连接(程序手动调用socket.close发送)
- 客户端收到FIN返回ACK应答,并进入TIME_WAIT时间等待状态客户端等待一段时间后,状态变为CLOSED,服务端收到应答后,状态变为CLOSED