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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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 算法

// 禁用 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);

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6