【网络编程】套接字的多种可选项

可以看出,套接字可选项是分层的。IPPROTOIP层可选项是IP协议相关事项IPPROTO TCP层可选项是TCP协议相关的事项,SOLSOCKET层是套接字相关的通用可选项

getsockopt&&setsockopt

#include <sys/socket.h>
int getsockopt(int sock, int level, int optname, void *optval, socklen t *optlen);
#include <sys/socket.h>
int setsockopt(int sock, int level, int optname, void *optval, socklen t *optlen);

注意:套接字类型只能在创建时决定,以后不能更改。

SO_SNDBUF&SO_RECBUF

创建套接字将同时生成I/O缓冲

SO_SNDBUF是输入缓冲大小相关项,SO_RECBUF是输入缓冲大小相关项,即可读取当前I/O缓冲大小,也可以进行更改。

SO_REUSEADDER

Time-wait状态

主机A是服务器端,因为是主机A向B发送FIN消息,故可以想象成服务器端在控制台输入CTRL+C。但问题是,套接字经过四次握手过程后并非立即消除,而是要经过一段时间的Time-wait状态。当然,只有先断开连接的(先发送FIN消息的)主机才经过Time-wait状态。因此,若服务器端先断开连接,则无法立即重新运行。套接字处在Time-wait过程时,相应端口是正在使用的状态。因此,就像之前验证过的,bind函数调用过程中当然会发生错误。

地址再分配

系统发生故障从而紧急停止的情况。这时需要尽快重启服务器端以提供服务,但因处于Time-wait状态而必须等待几分钟。因此,Time-wait有些情况下可能引发更大问题。

解决方案就是在套接字的可选项中更改SOREUSEADDR的状态。适当调整该参数,可将Time-wait状态下的套接字端口号重新分配给新的套接字。SO REUSEADDR的默认值为0(假)这就意味着无法分配Time-wait状态下的套接字端口号。因此需要将这个值改成1(真)。

TCP_NODELAY

Nagle算法应用于TCP层。

只有收到前一条数据的ACK消息时,Nagle算大才发送下一条数据。TCP套接字默认使用Nagle算法交换数据,因此最大限度地进行缓冲。

从图9-3右侧可以看到,发送字符串“Nagle”时共需10个数据包。由此可知,不使用Nagle算法将对网络流量(Traic:指网络负载或混杂程度)产生负面影响。即使只传输1个字节的数据,其头信息都有可能是几十个字节。因此,为了提高网络传输效率,必须使用Nagle算法。

根据传输数据的特性,网络流量未受太大影响时,不使用Nagle算法要比使用它时传输速度快。最典型的是“传输大文件数据”。将文件数据传入输出缓冲不会花太多时间,因此,即便不使用Nagle算法,也会在装满输出缓冲时传输数据包。这不仅不会增加数据包的数量,反而会在无需等待ACK的前提下连续传输,因此可以大大提高传输速度。一般情况下,不适用Nagle算法可以提高传输速度。但如果无条件放弃使用Nagle算法,就会增加过多的网络流量,反而会影响传输。因此,未准确判断数据特性时不应禁用Nagle算法。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 16:18:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 16:18:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 16:18:02       87 阅读
  4. Python语言-面向对象

    2024-06-17 16:18:02       96 阅读

热门阅读

  1. Vue 3 的常用响应式 API 总结

    2024-06-17 16:18:02       20 阅读
  2. Web前端设计入门:探索未知,点亮创意之光

    2024-06-17 16:18:02       28 阅读
  3. Web前端写随机抽奖:技术与创意的碰撞

    2024-06-17 16:18:02       29 阅读
  4. 免费公开的源代码

    2024-06-17 16:18:02       19 阅读
  5. 锐评js尺寸

    2024-06-17 16:18:02       30 阅读
  6. 聊聊jetcache的CacheManager

    2024-06-17 16:18:02       26 阅读
  7. Web前端中横线:深入探索与实际应用

    2024-06-17 16:18:02       29 阅读
  8. 分数限制下,选好专业还是选好学校?

    2024-06-17 16:18:02       27 阅读
  9. 常见排序方法原理及C语言实现

    2024-06-17 16:18:02       24 阅读
  10. pyautogui 图像定位功能

    2024-06-17 16:18:02       29 阅读
  11. 好专业还是好学校?

    2024-06-17 16:18:02       23 阅读
  12. DP读书:半导体物理考试重点

    2024-06-17 16:18:02       28 阅读
  13. 【Superset】匿名访问Dashboad

    2024-06-17 16:18:02       27 阅读
  14. 猜测Tomcat如何实现WebSocket协议

    2024-06-17 16:18:02       23 阅读