第九章 套接字的多种可选项

来源:互联网 发布:医院网络咨询 编辑:程序博客网 时间:2024/05/21 14:56

《TCP/IP网络编程》 尹圣雨 P140~P152


套接字具体多种特性,可通过可选项更改。


1 套接字可选项和I/O缓冲大小


SOL_LOCKET层是套接字相关的通用可选项

IPPROTO_IP层可选项是IP协议相关事项

IPPROTO_TCP层可选项是TCP协议相关事项

具体见P120~P141


可选项的读取和设置通过如下两个函数完成

#include<sys/socket.h>int getsockopt(int sock,int level,int optname,void *optval,socklen_t *optlen);//成功时返回0.失败时返回-1
sock用于查看选项套接字文件描述符

level 要查看的可选项的协议层

optname 要查看的可选项名

optval 保存查看结果的缓冲地址值

optlen 向第四个参数optval传递的缓冲大小。调用函数后,该变量中保存通过第四个参数返回的可选项信息的字节数


#include<sys/socket.h>int setsockopt(int sock,int level,int optname,const void *optval,socklen_t *optlen);//成功时返回0.失败时返回-1

sock用于更改可选项套接字文件描述符

level 要更改的可选项的协议层

optname 要更改的可选项名

optval 保存要更改的选项信息的缓冲地址值

optlen 向第四个参数optval传递的可选项信息的字节数。


套接字类型类型只能在创建时觉得,以后不能再更改。

---------------------------------------------------------------------------------------------------------

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

SO_RCVBUF是输入缓冲大小相关可选项,SO_SNDBUF的输出缓冲大小相关可选项。用这两个选项既可以读取当前I/O缓冲大小,也可以进行更改。

P142~P145的3个程序是验证上述内容的函数。


缓冲大小的设置需要谨慎处理,因为不会完全按照我们的要求进行,只是通过调用setsockopt函数向系统传递我们的要求。


2 SO_REUSEADDR


发生地震分配错误Binding Error

P146~P147程序学习:强制终止程序时,由操作系统关闭文件及套接字,此过程相当于调用close函数,也会向服务器端传递FIN消息。

1)在客户端控制台输入Q消息,或通过crtl+c终止程序。让客户端先通知服务器端终止程序,向服务器端发送FIN消息并经过四次握手过程,不会发生特别的事情。

2)服务器端和客户端已建立连接的状态下,向服务器端控制台输入CRTL+C,让服务器端先通知客户端终止程序,即强制关闭服务器端终止程序,那服务器端重新运行时将产生问题。若用同一端口号重新运行服务器端,将输出“bind() error”消息,并且无法再次运行


Time-wait状态

套接字经过四次握手过程后并非立即清除,而是要经过一段时间的TIME_WAIT状态。只有先断开连接(先发送FIN消息)的主机才经过Time-wait状态。若服务器端先断开连接,则无法立即重新运行。套接字处在Time-wait过程时,相应端口是正在使用的状态。


不管是服务器端还是客户端,套接字都会有Time-wait状态。先断开连接的套接字必然经过Time-wait过程。但无需考虑客户端的Time-wait状态。因为客户端套接字的端口号是任意指定的。与服务器端不同,客户端每次运行程序时都会动态分配端口号,因此无需过多关注Time-wait状态


地址再分配

在主机A的四次握手过程中,如果最后的数据丢失,则主机B会认为A未收到自己发送的FIN消息,因此重转。这时,收到FIN消息的主机A将重启Time-wait计时器。因此,如果网络状况不理想,Time-wait状态将持续。

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


3. TCP_NODELAY


Nagle算法为防止因数据包过多而发生网络过载。应用于TCP层,非常简单。

只有收到前一数据的ACK消息时,Nagle算法才发送下一数据。


TCP套接字默认使用Nagle算法交换数据,因此最大限度地进行缓冲,直到收到ACK。


不使用Nagle算法将对网络流量(Traffic:指网络负载或混杂程度)产生负面影响。为了提高网络传输效率,必须使用Nagle算法。


在程序中将字符串传给输出缓冲时并不是逐字传递的。

Nagle算法并不是什么时候都可以用,网络流量未受未受太大影响时,不使用Nagle算法要比使用它的传输速度快。最典型的就是“传输大文件数据”。将文件数据传入输出缓冲不会花太多时间,即使不用Nagle算法也会在装满输出缓冲时传输数据包。不仅不会增加数据包的数量,反而会在无需等待ACK的前提下连续传输,因此可以大大提高传输速度。


禁用Nagle算法

如果有必要就禁用Nagle算法。

Nagle算法使用与否在网络流量上差别不大,使用Nagle算法的传输速度更慢。


禁用方法,只需将套接字可选项TCP_NODELAY 改为1即可。

int iot_val=1;int setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(void*)&opt_val,sizeof(opt_val);















原创粉丝点击