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

这篇具有很好参考价值的文章主要介绍了《TCP/IP网络编程》阅读笔记--Timewait状态和Nagle算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1--Timewait状态

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

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

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

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

为什么需要 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 算法文章来源地址https://www.toymoban.com/news/detail-706251.html

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

到了这里,关于《TCP/IP网络编程》阅读笔记--Timewait状态和Nagle算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《TCP/IP网络编程》阅读笔记--getsockopt和setsockopt的使用

    目录 1--Socket的多种可选项 2--getsocketopt() 3--setsockopt() 4--代码实例         Socket 拥有多种可选项,其可分为 SOL_SOCKET 层,IPPROTO_IP 层和IPPROTO_TCP 层等,一般通过 getsocketopt() 和 setsockopt() 函数进行获取和设置; ① 基于  getsockopt() 函数,利用设置协议层为 SOL_SOCKET 和 SO_TYPE 可选项

    2024年02月09日
    浏览(28)
  • 《TCP/IP网络编程》阅读笔记--基于TCP的服务器端/客户端

    目录 1--TCP/IP协议栈 2--TCP服务器端默认函数调用顺序 3--TCP客户端的默认函数调用顺序 4--Linux实现迭代回声服务器端/客户端 5--Windows实现迭代回声服务器端/客户端 6--TCP原理 7--Windows实现计算器服务器端/客户端         TCP/IP协议栈共分 4 层,可以理解为数据收发分成了 4 个层

    2024年02月10日
    浏览(40)
  • 《TCP/IP网络编程》阅读笔记--基于UDP的服务器端/客户端

    目录 1--TCP和UDP的主要区别 2--基于 UDP 的数据 I/O 函数 3--基于 UDP 的回声服务器端/客户端 4--UDP客户端Socket的地址分配 5--UDP存在数据边界 6--UDP已连接与未连接的设置 ① TCP 提供的是可靠数据传输服务,而 UDP 提供的是不可靠数据传输服务; ② UDP 在结构上比 TCP 更简洁,其不会

    2024年02月09日
    浏览(48)
  • 《TCP/IP网络编程》阅读笔记--基于Windows实现Hello Word服务器端和客户端

    目录 1--Hello Word服务器端 2--客户端 3--编译运行 3-1--编译服务器端 3-2--编译客户端 3-3--运行 运行结果:

    2024年02月10日
    浏览(42)
  • Linux 网络编程学习笔记——一、TCP/IP 协议族

    数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(以太网、令牌环等)上的传输,不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。最常用的协议是 ARP(Address Resolve Protocol,地址解析协议)和 RARP(

    2024年02月02日
    浏览(61)
  • Linux网络编程(TCP状态转换关系)

    本篇文章来讲解一下TCP的状态转换关系,学习这个状态转换关系对于我们深入了解网络编程是非常有必要的。 客户端状态转换: 1.CLOSED - SYN-SENT:当客户端尝试与服务器建立连接时,客户端从CLOSED状态转换到SYN-SEND状态。此时客户端发送SYN(同步)包,表示请求建立连接,并

    2024年02月07日
    浏览(33)
  • 《TCP IP网络编程》

            2023.6.28 正式开始学习网络编程。 每一章每一节的笔记都会记录在博客中以便复习。         网络编程又叫套接字编程。所谓网络编程,就是编写程序使两台连网的计算机相互交换数据。 为什么叫套接字编程? 我们平常将插头插入插座上就能从电网中获取电力,同

    2024年02月11日
    浏览(35)
  • TCP/IP网络编程(一)

    1.1.1 构建打电话套接字 以电话机打电话的方式来理解套接字。 **调用 socket 函数(安装电话机)时进行的对话:**有了电话机才能安装电话,于是就要准备一个电话机,下面函数相当于电话机的套接字。 **调用 bind 函数(分配电话号码)时进行的对话:**套接字同样如此。就想

    2024年02月03日
    浏览(33)
  • TCP/IP网络编程(三)

    多播(Multicast)方式的数据传输是 基于 UDP 完成的 。因此 ,与 UDP 服务器端/客户端的实现方式非常接近。区别在于,UDP 数据传输以单一目标进行,而多播数据 同时传递到加入(注册)特定组的大量主机 。换言之, 采用多播方式时,可以同时向多个主机传递数据 。 14.1.1 多

    2024年02月03日
    浏览(34)
  • TCP/IP网络编程(二)

    本章将讨论如何优雅地断开相互连接的套接字。之前用的方法不够优雅是因为,我们是调用 close 或 closesocket 函数单方面断开连接的。 TCP中的断开连接过程比建立连接过程更重要,因为连接过程中一般不会出现大的变数,但断开过程有可能发生预想不到的情况,因此应准确掌

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包