本章我们主要讲述一下nginx中socket的一些相关设置函数。
1. os/unix/ngx_socket.h头文件
下面我们对该头文件进行简单的介绍:
1.1 socket相关数据类型定义
这里定义了ngx_socket_t数据类型及ngx_socket函数。
1.2 socket阻塞性设置
在ngx_auto_config.h头文件中,有如下定义:
#ifndef NGX_HAVE_FIONBIO
#define NGX_HAVE_FIONBIO 1
#endif
因此这里我们采用ioctl方式设置socket的阻塞特性。
1.3 socket push特性设置
这里我们首先讲述一下TCP_CORK
:
所谓的CORK就是塞子的意思,形象的理解就是用CORK将连接塞住,使数据先不发送出去,等到拔去塞子后再发送出去。设置该选项后,内核会尽量把小数据包拼成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据。
然而,TCP_CORK的实现可能并不像你想象的那么完美,CORK并不会将连接完全塞住。内核其实并不知道应用层到底什么时候会发送第二批数据用于和第一批数据拼接以达到MTU的大小,因此内核会给出一个时间限制,在该时间内没有拼接成一个大包(努力接近MTU)的话,内核就会无条件发送。也就是说若应用层程序发送小数据包的间隔不够短时,TCP_CORK就没有一点作用,反而会失去数据的实时性(每个小包数据都会延时一定时间再发送)。
这里的TCP_NOPUSH与TCP_CORK含义是相同的。
在ngx_auto_headers.h头文件中,有如下定义:
#ifndef NGX_LINUX
#define NGX_LINUX 1
#endif
因此这里我们采用setsockopt(TCP_CORK)
的方式来进行设置。
1.4 关闭socket
关于socket shutdown()与close()的区别,请参看tcp半关闭状态一文。
2. os/unix/ngx_socket.c源代码
这里程序代码比较简单,不再赘述。
[参看]:
-
linux网络编程之shutdown() 与 close()函数详解
-
linux下close()与shutdown()