unix网络编程-第七章-小结

套接字选项 通用,IPv4,IPV6,TCP和SCTP

fcntl函数,因为它是把套接字设置为非阻塞式I/O型或信号驱动式I/O型以及设置套接字属主的POSIX的方法。

套接字选项粗分为两大基本类型:一是启用或者禁止某个特性的二元选项,二是取得并返回我们可以设置或检查的特定值的选项。

设置或获取选项有时序上的考虑

如果想在三路握手完成时确保这些套接字选项中的某一个是给已连接套接字设置的,那么我们必须先给监听套接字设置该选项。

SO_ERROR内核能以下面两种方式之一立即通知进程这个错误。

1.如果进程阻塞在对该套接字的select调用上,那么无论是检测可读条件还是可写条件,select均返回并设置其中一个或所有两个条件。

2.如果进程使用信号驱动式I/O模型,那就给进程或进程组产生一个SIGIO信号。

SO_KEEPALIVE套接字选项 TCP给对端发送一个保持存活探测分节

1.对端以期望的ACK响应。

2.对端以RST响应,它告知本端TCP:对端已崩溃且已重新启动。

3.对端对保持存活探测分节没有任何响应。

时间参数:大多数内核是基于整个内核维护这些时间参数的,而不是基于每个套接字维护的。本选项一般由服务器使用,保持存活选项将检查出这些半开连接并终止它们。

SO_LINGER选项 默认操作是close立即返回,但是如果有数据残留在套接字缓冲区中,系统试图把这些数据发送给对端。

TIME_WAIT状态是我们的朋友,不要试图避免这个状态。

使用这个选项时,应用程序检查close的返回值非常重要,如果在数据发送完并被确认前延滞时间到的话,close将返回EWOULDBLOCK错误。

设置了SO_LINGER套接字选项后,close的成功返回只是告诉我们先前发送的数据(和FIN)已由对端TCP确认,而不能告诉我们对端应用程序是否已读取数据。

让客户知道服务端已读取数据的一个方法是改为调用shutdown而不是close,并等待对端close连接的当地端(服务器端)

三个返回时机:

1.close立即返回,根本不等待

2.close一直拖延到接收了对于客户端FIN的ACK才返回。

3.后跟一个read调用的shutdown一直等到接收了对端的FIN才返回。

获知对端应用程序已读取我们的数据的另外一个方法是使用应用级确认,ACK。

对于TCP来说,套接字接收缓冲区中可用空间的大小限定了TCP通告对端的窗口大小。

TCP流量控制,如果对端无视窗口大小而发出了超过该窗口大小的数据,本端TCP将丢弃它们。

对于UDP涞水,当接收到的数据装不进套接字接收缓冲区时,该数据报就被丢弃。

UDP是没有流量控制的。事实上较快的发送端甚至可以淹没本机的网络接口,导致数据表被本机丢弃。

TCP的窗口规模选项是在建立连接时用SYN分节与对端互换得到的。对于客户,这意味着SO_RCVBUF选项必须在调用connect之前设置。对于服务器,这意味着该选项必须在调用listen之前给监听套接字设置。给已连接套接字设置该选项对于可能存在的窗口规模选项没有任何影响。套接字缓冲区的大小总是由新创建的已连接套接字从监听套接字继承而来。

TCP套接字缓冲区的大小只是是相应连接的MSS值的四倍。依据的是TCP快速恢复算法的工作机制。

TCP必须为每个分节保留一个副本。

UDP套接字的发送缓冲区中可用空间的字节数从不改变,并且不为由应用程序传递给它的数据报保留副本。

UDP没有发送缓冲区,只有发送缓冲区大小这个属性。

SO_REUSEADDR允许启动一个监听服务器并捆绑众所周知的端口,及时以前建立的将该端口用作它们的本地端口的连接仍存在。它允许单个进程捆绑同一个端口到多个套接字上,只要每次捆绑指定不同的本地IP地址即可。

在所有TCP服务器程序中,在调用bind之前设置SO_REUSEADDR套接字选项。

当编写一个可在同一时刻在同一主机运行多次的多播应用程序时,设置SO_REUSEADDR套接字选项,并将所参与多播组的地址作为本地IP地址捆绑。

SO_REUSEADDR有个潜在的安全问题,NFC通常端口2049不是保留端口。

一般情况下,在原始套接字上发送的数据报其IP首部是由内核构造的。

TCP_NODELAY开启本选项将禁止TCP的Nagle算法

Nagel算法的目的在于减少广域网上小分组的数目,防止一个连接在任何时刻有多个小分组待确认。

Nagle算法常与ACK延滞算法联合使用。该算法使得TCP在接收到数据后不立即发送ACK,而是等待一小段时间,然后才发送ACK。TCP期待这段时间内自身有数据发送回对端,被延滞的ACK就可以由这些数据捎带,从而省掉一个TCP分节。

不适合用Nagle算法和TCP的ACK延滞算法的客户时以若干小片数据向服务器发送单个逻辑请求的客户。

设置某个文件状态标识的唯一正确方法是:先取得当前标志,与新标识逻辑或后再设置标识

SO_SNDBUF和SO_RCVBUF套接字选项主要用途是长胖管道上的批量数据传送。另一方面,UDP可能期望增加接收缓冲区的大小以允许内核在应用进程较忙时排队更多的数据报。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值