TCP (Transmission Control Protocol) 传输控制协议 #
- TCP 面向连接的,提供可靠交付的,提供全双工通信,面向字节流的
- 在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP
- 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段
如果不能及时收到一个确认,将重发这个报文段 - 另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据
- TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间
TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据
TCP报文格式,首部共20字节+选项
0 4 10 16 31
16位源端口号 16位目的端口号
32位序号(Sequence Number)
32位确认序号(Acknowledgment Number)
4位首部长度 6位保留 6位位码 16位窗口大小
16位检验和 16位紧急指针
选项(长度可变)
数据
- 序号:数据包序号,如果发一个确认一个效率太低,可以一次发多个
- 确认号:累计确认,告诉发送者下一个该发第几个数据包了,不是一个一个确认
- 首部长度:TCP首部长度
- 位码即tcp标志位:6 bit
- URG(urgent紧急) 优先级高,优先传
- ACK(acknowledgement确认) 0-确认号无效 1-确认号有效
- PSH(push传送) 接收方应该尽快将这个报文段交给应用层
- RST(reset重置) 重建连接
- SYN(synchronous建立联机) 用来发起一个连接
- FIN(finish结束) 释放连接
- 窗口:流量控制由连接的每一端通过声明的窗口大小来提供
- 检验和:覆盖TCP首部和TCP数据
- 紧急指针:只有当URG标志置1时紧急指针才有效
TCP建立连接,三次握手 #
首先 Server 调用 listen() 监听端口,等待连接,Server状态为 LISTEN
- Client 调用 connect() 发送
[SYN] seq=x
此时Client状态为SYN_SENT
- Server 收到后,响应
[SYN, ACK] seq=y ack=x+1
此时Server状态为SYNC_RCVD
- Client 收到后,响应
[ACK] seq=x+1 ack=y+1
此时Client/Server状态都为ESTABLISHED
TCP断开连接,四次挥手 #
客户端或服务器均可主动发起挥手动作,任何一方执行close()操作即可产生挥手操作
- A向B发送断开请求
[FIN] seq=x
此时A状态为FIN_WAIT_1
- B向A响应
[ACK] seq=y ack=x+1
此时B状态为CLOSE_WAIT
,A收到后的状态为FIN_WAIT_2
此时B仍可向A发送数据,B若发送数据,A仍要接收 - B向A发送断开请求
[FIN] seq=y+1
此时B状态为LAST_ACK
- A向B响应
[ACK] seq=x+1 ack=y+2
此时A状态为TIME_WAIT