TCP 是一个可靠的(reliable)、面向连接的(connection-oriented)、基于字节流(byte-stream)、全双工(full-duplex)的协议。发送端在发送数据以后启动一个定时器,如果超时没有收到对端确认会进行重传,接收端利用序列号对收到的包进行排序、丢弃重复数据,TCP 还提供了流量控制、拥塞控制等机制保证了稳定性。
TCP协议解决:顺序问题、丢包问题、连接维护、流量控制、拥塞控制
TCP状态位:SYN发起一个连接,ACK回复,RST重新连接,FIN结束连接
TCP报文首部由源端口、目标端口、序列号、确认号、flags、窗口大小、可选项组成
SYN:用于发起连接数据包同步双方的而出是序列号
ACK:确认数据包
RST:用来强制断开连接,通常是之前建立的连接已经不在了、包不合法或者是在无能为力处理
FIN:通知对方我发完了所有数据,准备断开连接
PSH:告知对方这些数据包收到以后应该马上交给上层应用,不能缓存起来
可选项MSS:是TCP允许的从对方接受的最大报文段
可选项Window Scale:窗口缩放选项
MTU:以太网的最大传输单元(1500字节)
IPv4数据包的最大大小为65535字节,当一个IP数据包大于MTU时,IP会把数据报文切割成多个小的片段
利用IP包分片的策略,有一种对应的网络攻击方式IP fragment attack,就是一直传More fragments=1的包,导致接收方一直缓存分片,从而可能导致接收方内存耗尽
MSS:TCP为了避免被发送方分片,会主动把数据分割成小段再交给网络层,MSS是其中最大的分段大小
MSS = MTU - IP header头大小 - TCP头大小
在以太网中 TCP 的 MSS = 1500(MTU) - 20(IP 头大小) - 20(TCP 头大小)= 1460
4个定时器:重传定时器、坚持定时器、保活定时器、2MSL定时器
客户端建立连接时状态:CLOSED、SYN-SENT、ESTABLISHED
服务端建立连接时状态:CLOSED、LISTEN、SYN-RCVD、ESTABLISHED
客户端关闭连接时状态:ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、TIME-WAIT、CLOSED
服务端关闭连接时状态:ESTABLISHED、CLOSE-WAIT、LAST-ACK、CLOSED
为什么TIME-WAIT后要等待2个MSL才关闭连接:
1 个 MSL 确保四次挥手中主动关闭方最后的 ACK 报文最终能达到对端
1 个 MSL 确保对端没有收到 ACK 重传的 FIN 报文可以到达
2MS = 去向 ACK 消息最大存活时间(MSL) + 来向 FIN 消息的最大存活时间(MSL)