TCP协议
TCP协议
IP数据包不可靠,需要又他的上层协议即TCP协议进行控制
传输控制协议——TCP
- 面向连接的,可靠的,基于字节流的传输层通信协议。
- 将应用层的数据流分割成报文段并发送给目标节点TCP层
- 数据包都有序号,对方收到则发送ACK确认,在规定时间内(RTT确认)未收到则重传
- 使用校验和来检验数据在传输过程中是否有误
TCP报头
TCP三次握手
为什么需要三次握手才能建立连接?
为了初始化Sequence Number的初始值
首次握手隐患——SYN超时
Server收到Client的SYN,回复SYN-ACK的时候未收到ACK确认
Server不断重试直至超时,Linux默认重试五次,从一秒开始每次等待时间翻倍,等待63秒(1+2+4+8+16+32)才断开连接。
风险
可能会遭到SYN Flood攻击,不停发握手请求,Linux的保护措施是SYN队列满了后,通过tcp_syncokies参数回发SYN Cookie,
如果正常链接Client会回发SYN Cookie,直接建立连接。
保活机制
如果连接在保活时间处于非活动状态,server将向对方发送保活探测报文,如果未收到响应则继续发送
直到发送报文的次数达到保活探测数后任未响应则中断连接。
TCP 四次挥手
MSL:最长报文段寿命 liux中为30s
为什么有TIME-WAIT状态
- 防止server没收到ACK确认然后重发FIN包,一来一回正好两个MSL时间
- 避免新旧连接混淆(例如避免路由器缓存IP数据包,以至于和新连接的包混淆)
为什么需要四词挥手
因为是全双工,发送方和接收方都需要FIN和ACK报文。
server出现大量CLOSE-WAIT的原因
对方关闭连接,我方忙于读写,没有及时关闭连接,多数情况为代码有bug或线程数配置不合理等。
查看连接主机情况
1 | netstat -n | awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Alfred的小站!