《TCP/IP网络编程》阅读笔记--Timewait状态和Nagle算法

1--Timewait状态

对于服务器端/客户端,当一端结束连接时,会向另一端发送 FIN 消息;两端的在经过四次挥手过程后,其 Socket 不会马上消除,而是会处于一个 Time-wait 状态的阶段,此时 Socket 拥有的端口号并没有得到释放 ,因此不能使用相同的端口号

只有先断开连接的(先发送 FIN 消息)的主机才会经过 Time-wait 状态

通过 setsockopt() 函数来更改 SO_REUSEADDR 的状态(设置为TRUE)可以将处于 Time-wait 状态的 Socket 端口号重新分配 给新的 Socket,具体代码参考:代码实例

为什么需要 timewait 状态?

① 对于上图,当客户端主动断开连接,进行四次挥手时,客户端会进入一个 timewait 状态,这个状态可以确保客户端最后一次发送的 ACK 信息报可以顺利到达服务器端;

因为最后一次发送的 ACK 信息报可能会在传输过程中丢失 ,导致服务器端无法顺利关闭连接;这时服务器端就会以为它第三次挥手传送的 FIN 信息报 没有送达客户端,就会启动超时重传 FIN 信息报;但如果客户端直接关闭了,就会造成永远收不到服务器端超时重传的 FIN 信息报(其实会收到的,但由于客户端关闭了,就会将收到的信息报认为是非法信息报,从而返回一个 RST 信息报),同时也无法重新发送最后一次挥手的 ACK 信息报,从而造成异常。

同理,服务器端不断超时重传 FIN 信息报,但一直无法收到 ACK 信息报(只会收到客户端发送过来的 RST 信息报),就会无法顺利地 close;

② 在第四次挥手后,经过 2msl 的 timewait 时间足以让本次连接产生的所有报文段都从网络中消失,这样下一次新的连接中就肯定不会出现旧连接的报文段了;

2--Nagle算法

Nagle 算法可以防止数据包过多而导致的网络过载问题,其应用于 TCP 层;

Nagle 算法规定:只有收到前一数据的 ACK 消息时,Nagle 算法才会发送下一数据;

一般情况下,不使用 Nagle 算法可以提高传输速度,当传输大文件时可以禁用 Nagle 算法,通过 setsockopt() 函数来设置 TCP_NODELAYTrue禁用 Nagle 算法

cpp 复制代码
// 禁用 Nagle 算法
int opt_val = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&opt_val, sizeof(opt_val));

// 查看 Nagle 状态
int opt_val;
socklen_t opt_len;
opt_len = sizeof(opt_val);
getsockopt(sock, IPPROTO_TCP, TCP_NPDELAY, (void*) &opt_val, &opt_len);
相关推荐
草莓熊Lotso4 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
kekekzt15 小时前
TCP协议的粘包问题介绍,IP分片,MTU,MSS,滑动窗口的概念及之间的关系
网络·网络协议·tcp/ip
Learn-Share_HY21 小时前
[IT Network]如何配置反向路徑過濾器(rp_filter),以解決路由不對稱問題?
linux·嵌入式硬件·物联网·网络协议·tcp/ip·http·iot
Fxkj8881 天前
企业新媒体IP陪跑真实价值解析:合作体验与效果评判标准
大数据·人工智能·tcp/ip·媒体
DevOpenClub1 天前
全球区域与 IP 定位工作台案例方案
大数据·网络·网络协议·tcp/ip
wuyk5551 天前
从零吃透 Modbus 通信|第 6 章:线圈功能码 05/0F 实现 & Modbus‑TCP 基础入门
c语言·网络·网络协议·tcp/ip
xieliyu.1 天前
计算机网络‑IP 协议解析:核心特性总结
网络·笔记·网络协议·学习·tcp/ip·计算机网络
初願致夕霞1 天前
五种IO模型(详解非阻塞IO与多路转接)
linux·前端·网络·数据库·tcp/ip
Shadow(⊙o⊙)1 天前
HTTP——服务端、客户端格式,浏览器解析
网络·tcp/ip·http
库玛西1 天前
深入浅出传输层:UDP 与 TCP 协议全景指南
linux·服务器·网络·c++·笔记·tcp/ip·udp