TCP - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-06-09
名称
tcp-TCP协议
语法
#包括
#包括
#包括
tcp_socket =套接字(AF_INET,SOCK_STREAM,0);
说明
这是RFC 793,RFC 1122和RFC 2001中定义的TCP协议的实现,带有NewReno和SACK扩展名。对于v4和v6版本,它在ip(7)顶部的两个套接字之间提供可靠的,面向流的全双工连接。 TCP保证数据按顺序到达并重新传输丢失的数据包。它生成并检查每个数据包的校验和以捕获传输错误。 TCP不保留记录边界。
新创建的TCP套接字没有远程或本地地址,并且未完全指定。要创建传出TCP连接,请使用connect(2)建立与另一个TCP套接字的连接。要接收新的传入连接,请首先将套接字绑定(2)到本地地址和端口,然后调用listen(2)将套接字置于侦听状态。之后,可以使用accept(2)接受每个传入连接的新套接字。完全指定了成功调用了accept(2)或connect(2)的套接字,并且可以传输数据。无法在侦听或尚未连接的套接字上传输数据。
Linux支持RFC 1323 TCP高性能扩展。其中包括防止包裹序列号(PAWS),窗口缩放和时间戳。窗口缩放允许使用较大的(> 64 kB)TCP窗口,以支持具有高延迟或带宽的链接。要使用它们,必须增加发送和接收缓冲区的大小。可以使用/ proc / sys / net / ipv4 / tcp_wmem和/ proc / sys / net / ipv4 / tcp_rmem文件全局设置它们,也可以在单独的套接字上通过使用setockopt(2)调用使用SO_SNDBUF和SO_RCVBUF套接字选项来设置它们。
通过SO_SNDBUF和SO_RCVBUF机制声明的套接字缓冲区的最大大小受/ proc / sys / net / core / rmem_max和/ proc / sys / net / core / wmem_max文件中的值限制。请注意,TCP实际上分配的空间是setsockopt(2)调用中请求的缓冲区大小的两倍,因此,后续的getsockopt(2)调用将不会返回与setsockopt(2)调用中请求的缓冲区大小相同的缓冲区。 TCP将多余的空间用于管理目的和内部内核结构,并且/ proc文件值反映出比实际TCP窗口更大的大小。在单个连接上,套接字缓冲区的大小必须在调用listen(2)或connect(2)之前设置,以使其生效。有关更多信息,请参见socket(7)。
TCP支持紧急数据。紧急数据用于向接收器发送信号,告知某些重要消息是数据流的一部分,应尽快对其进行处理。要发送紧急数据,请指定send(2)的MSG_OOB选项。收到紧急数据后,内核会使用SIOCSPGRP或FIOSETOWN ioctl(或POSIX.1指定的fcntl(2)F_SETOWN操作)向已设置为套接字"所有者"的进程或进程组发送SIGURG信号。启用SO_OOBINLINE套接字选项后,紧急数据将放入普通数据流中(程序可以使用下面描述的SIOCATMARK ioctl测试其位置),否则仅当为recv(2)设置了MSG_OOB标志时才能接收该数据。或recvmsg(2)。
如果存在带外数据,则select(2)表示文件描述符具有特殊情况,而poll(2)表示POLLPRI事件。
Linux 2.4引入了许多更改,以提高吞吐量和扩展性以及增强的功能。其中一些功能包括对零拷贝sendfile(2)的支持,显式拥塞通知,TIME_WAIT套接字的新管理,保持活动套接字选项以及对Duplicate SACK扩展的支持。
Address formats
TCP建立在IP之上(请参阅ip(7))。 ip(7)定义的地址格式适用于TCP。 TCP仅支持点对点通信。不支持广播和多播。
/proc interfaces
可以通过目录/ proc / sys / net / ipv4 /中的文件访问系统范围的TCP参数设置。另外,大多数IP / proc接口也适用于TCP;其他IP / proc接口也适用于TCP。参见ip(7)。描述为布尔值的变量采用整数值,其中非零值(" true")表示启用了相应的选项,而零值(" false")则表示禁用了该选项。
- tcp_abc(Integer; default: 0; Linux 2.6.15 to Linux 3.8)
Control the Appropriate Byte Count (ABC), defined in RFC 3465.
ABC is a way of increasing the congestion window
(cwnd)more slowly in response to partial acknowledgments.
Possible values are:- 0
- 每次确认增加一次cwnd(无ABC)
- 1
- 每次确认完整段,增加一次cwnd
- 2
- 如果确认是两个段的,则允许将cwnd增加两个,以补偿延迟的确认。
- tcp_abort_on_overflow(Boolean; default: disabled; since Linux 2.4)
- 如果监听服务太慢并且无法跟上并接受它们,请启用重置连接。这意味着,如果由于突发而发生溢出,则连接将恢复。仅当您确实确定不能将侦听守护程序调整为更快地接受连接时,才启用此选项。启用此选项可能会损害服务器的客户端。
- tcp_adv_win_scale(integer; default: 2; since Linux 2.4)
- 如果tcp_adv_win_scale大于0,则将缓冲开销计数为字节/ 2 ^ tcp_adv_win_scale。如果tcp_adv_win_scale小于或等于零,则为bytes-bytes / 2 ^(-tcp_adv_win_scale)。
- 套接字接收缓冲区空间在应用程序和内核之间共享。 TCP将缓冲区的一部分保留为TCP窗口,这是发布到另一端的接收窗口的大小。其余空间用作"应用程序"缓冲区,用于将网络与调度和应用程序延迟隔离。 tcp_adv_win_scale的默认值为2,表示用于应用程序缓冲区的空间是总空间的四分之一。
- tcp_allowed_congestion_control(String; default: see text; since Linux 2.4.20)
- 显示/设置可用于非特权进程的拥塞控制算法选择(请参见TCP_CONGESTION套接字选项的描述)。列表中的项目用空格分隔,并以换行符终止。该列表是tcp_available_congestion_control中列出的列表的子集。该列表的默认值为" reno",加上tcp_congestion_control的默认设置。
- tcp_autocorking(Boolean; default: enabled; since Linux 3.14)
- 如果启用此选项,则内核会尝试尽可能合并小写操作(来自连续的write(2)和sendmsg(2)调用),以减少发送的数据包总数。如果在Qdisc队列或设备传输队列中至少有一个流的先前数据包正在等待,则完成合并。当应用程序知道如何/何时解开套接字时,它们仍然可以使用TCP_CORK套接字选项来获得最佳行为。
- tcp_available_congestion_control(String; read-only; since Linux 2.4.20)
- 显示已注册的拥塞控制算法的列表。列表中的项目用空格分隔,并以换行符终止。此列表是tcp_allowed_congestion_control中该列表的限制集。更多的拥塞控制算法可以作为模块使用,但无法加载。
- tcp_app_win(integer; default: 31; since Linux 2.4)
- 此变量定义为缓冲开销保留的TCP窗口字节数。
- 窗口中最多保留(window / 2 ^ tcp_app_win,mss)个字节供应用程序缓冲区使用。值为0表示没有保留任何金额。
- tcp_base_mss(Integer; default: 512; since Linux 2.6.17)
- 打包层路径MTU发现(MTU探测)将使用的search_low的初始值。如果启用了MTU探测,则这是该连接使用的初始MSS。
- tcp_bic(Boolean; default: disabled; Linux 2.4.27/2.6.6 to 2.6.13)
- 启用BIC TCP拥塞控制算法。 BIC-TCP是仅发送方的更改,可确保在大窗口下实现线性RTT公平性,同时提供可伸缩性和有限的TCP友好性。该协议结合了两种方案,称为加性增加和二进制搜索增加。当拥塞窗口很大时,加法器的增加量将以较大的增量增加,从而确保线性RTT公平性和良好的可伸缩性。在较小的拥塞窗口下,二进制搜索增加提供TCP友好性。
- tcp_bic_low_window(integer; default: 14; Linux 2.4.27/2.6.6 to 2.6.13)
- 设置阈值窗口(以数据包为单位),BIC TCP在该阈值窗口开始调整拥塞窗口。低于此阈值BIC TCP的行为与默认TCP Reno相同。
- tcp_bic_fast_convergence(Boolean; default: enabled; Linux 2.4.27/2.6.6 to 2.6.13)
- 强制BIC TCP更快地响应拥塞窗口中的更改。允许共享同一连接的两个流更快地收敛。
- tcp_congestion_control(String; default: see text; since Linux 2.4.13)
- 设置默认的拥塞控制算法以用于新连接。算法" reno"始终可用,但是根据内核配置,可能还有其他选择。此文件的默认值是内核配置的一部分。
- tcp_dma_copybreak(integer; default: 4096; since Linux 2.6.24)
- 如果系统中存在一个套接字读取并且将内核配置为CONFIG_NET_DMA选项,则套接字读取的大小的下限(以字节为单位)将被卸载到DMA复制引擎。
- tcp_dsack(Boolean; default: enabled; since Linux 2.4)
- 启用RFC2883 TCP Duplicate SACK支持。
- tcp_ecn(Integer; default: see below; since Linux 2.4)
- 启用RFC 3168显式拥塞通知。
- This file can have one of the following values:
- 0
- 禁用ECN。既不发起也不接受ECN。这是Linux 2.6.30之前(包括该版本)的默认设置。
- 1
- 在传入连接请求时启用ECN,并在传出连接尝试时请求ECN。
- 2
- 当传入连接请求时启用ECN,但不要在传出连接上请求ECN。从Linux 2.6.31开始,此值受支持,并且是默认值。
- 启用后,由于路径中的中间框较旧且行为异常,可能会影响到某些目标的连接,从而导致连接断开。但是,为了促进和鼓励使用选项1进行部署,并解决此类故障设备,引入了tcp_ecn_fallback选项。
- tcp_ecn_fallback(Boolean; default: enabled; since Linux 4.1)
- 启用RFC 3168第6.1.1.1。节倒退。启用后,在正常SYN重传超时时间内超时的传出ECN设置SYN将通过CWR和ECE清零来重新发送。
- tcp_fack(Boolean; default: enabled; since Linux 2.2)
- 启用TCP转发确认支持。
- tcp_fin_timeout(integer; default: 60; since Linux 2.2)
- 这指定在强制关闭套接字之前等待最终FIN数据包的秒数。严格地,这违反了TCP规范,但是为了防止拒绝服务攻击,这是必需的。在Linux 2.2中,默认值为180。
- tcp_frto(integer; default: see below; since Linux 2.4.21/2.6)
- 启用F-RTO,这是用于TCP重传超时(RTO)的增强恢复算法。在数据包丢失通常是由于随机无线电干扰而不是中间路由器拥塞引起的无线环境中,这特别有益。有关更多详细信息,请参见RFC 4138。
- This file can have one of the following values:
- 0
- 已禁用。这是Linux 2.6.23之前(包括该版本)的默认设置。
- 1
- 基本版本F-RTO算法已启用。
- 2
- 如果流使用SACK,则启用SACK增强的F-RTO。在使用SACK的情况下,也可以使用基本版本,尽管在这种情况下,F-RTO与启用SACK的TCP流的数据包计数相互作用不良。自Linux 2.6.24起,此值为默认值。
- 在Linux 2.6.22之前,此参数是一个布尔值,仅支持上述值0和1。
- tcp_frto_response(integer; default: 0; since Linux 2.6.22)
- When F-RTO has detected that a TCP retransmission timeout was spurious
(i.e., the timeout would have been avoided had TCP set a
longer retransmission timeout),
TCP has several options concerning what to do next.
Possible values are:
- 0
- 利率减半;平滑且保守的响应,导致一次RTT后的拥塞窗口(cwnd)和慢启动阈值(ssthresh)减半。
- 1
- 非常保守的回应;不建议这样做,因为尽管有效,但它与Linux TCP其余部分的交互性很差;立即将swnd减半。
- 2
- 积极反应;撤消现在已知不必要的拥塞控制措施(忽略丢失重发的可能性,这将需要TCP更加谨慎);将cwnd和ssthresh恢复为超时之前的值。
- tcp_keepalive_intvl(integer; default: 75; since Linux 2.4)
- TCP保持活动探测之间的秒数。
- tcp_keepalive_probes(integer; default: 9; since Linux 2.2)
- 如果未从另一端获得响应,则在放弃并终止连接之前要发送的最大TCP保持活动探测数。
- tcp_keepalive_time(integer; default: 7200; since Linux 2.2)
- TCP开始发出保持活动状态探测之前,连接需要空闲的秒数。仅当启用SO_KEEPALIVE套接字选项时,才会发送保持活动状态。默认值为7200秒(2小时)。启用保持活动状态后,大约再过11分钟(9个探测间隔75秒)后,空闲连接终止。
- 请注意,底层的连接跟踪机制和应用程序超时可能要短得多。
- tcp_low_latency(Boolean; default: disabled; since Linux 2.4.21/2.6; obsolete since Linux 4.14)
- 如果启用,TCP堆栈会做出更倾向于较低延迟而不是较高吞吐量的决策。如果禁用此选项,则首选更高的吞吐量。 Beowulf计算群集就是应更改此默认值的应用程序示例。从Linux 4.14开始,此文件仍然存在,但是其值将被忽略。
- tcp_max_orphans(integer; default: see below; since Linux 2.4)
- 系统中允许的孤立的TCP套接字(未附加到任何用户文件句柄)的最大数量。当超过此数目时,孤立连接将重置并显示警告。存在此限制仅是为了防止简单的拒绝服务攻击。不建议降低此限制。网络条件可能会要求您增加允许的孤儿数量,但请注意,每个孤儿最多可能会吃掉ti64 kB的不可交换内存。默认初始值设置为等于内核参数NR_FILE。根据系统中的内存调整此初始默认值。
- tcp_max_syn_backlog(integer; default: see below; since Linux 2.2)
- 尚未从连接客户端收到确认的排队连接请求的最大数量。如果超过此数目,内核将开始丢弃请求。当系统中的内存足够或更大(>= 128́MB)时,默认值256将增加到1024;对于那些内存非常低的系统,默认值将减小为128(
- 在Linux 2.6.20之前,建议如果需要将其增加到1024以上,则应该修改include / net / tcp.h中SYNACK哈希表(TCP_SYNQ_HSIZE)的大小,以保持
- TCP_SYNQ_HSIZE * 16
- 并且应该重新编译内核。在Linux 2.6.20中,删除了固定大小的TCP_SYNQ_HSIZE以支持动态大小调整。
- tcp_max_tw_buckets(integer; default: see below; since Linux 2.4)
- 系统中允许的处于TIME_WAIT状态的最大套接字数。存在此限制仅是为了防止简单的拒绝服务攻击。 NR_FILE * 2的默认值根据系统中的内存进行调整。如果超过此数字,则插座将关闭并打印警告。
- tcp_moderate_rcvbuf(Boolean; default: enabled; since Linux 2.4.17/2.6.7)
- 如果启用,TCP将执行接收缓冲区自动调整,尝试自动调整缓冲区的大小(不大于tcp_rmem [2]),以匹配路径为全吞吐量所需的大小。
- tcp_mem(since Linux 2.4)
This is a vector of 3 integers: [low, pressure, high].
These bounds, measured in units of the system page size,
are used by TCP to track its memory usage.
The defaults are calculated at boot time from the amount of
available memory.
(TCP can only use
low memoryfor this, which is limited to around 900 megabytes on 32-bit systems.
64-bit systems do not suffer this limitation.)- low
- 当TCP全局分配的页面数低于此数量时,TCP不会调节其内存分配。
- pressure
- 当TCP分配的内存量超过此页数时,TCP会降低其内存消耗。一旦分配的页数下降到低位标记以下,就会退出此内存压力状态。
- high
- TCP将在全局范围内分配的最大页面数。该值将覆盖内核施加的任何其他限制。
- tcp_mtu_probing(integer; default: 0; since Linux 2.6.17)
This parameter controls TCP Packetization-Layer Path MTU Discovery.
The following values may be assigned to the file:- 0
- 残障人士
- 1
- 默认情况下禁用,当检测到ICMP黑洞时启用
- 2
- 始终启用,请使用tcp_base_mss的初始MSS。
- tcp_no_metrics_save(Boolean; default: disabled; since Linux 2.6.6)
- 默认情况下,当连接关闭时,TCP会将各种连接度量标准保存在路由缓存中,以便不久的将来建立的连接可以使用它们来设置初始条件。通常,这会提高整体性能,但有时可能会导致性能下降。如果启用了tcp_no_metrics_save,则TCP将不会在关闭连接时缓存指标。
- tcp_orphan_retries(integer; default: 8; since Linux 2.4)
- 探测连接的另一端(已被我们的一端关闭)的最大尝试次数。
- tcp_reordering(integer; default: 3; since Linux 2.4)
- 可以在TCP数据包流中对最大数据包进行重新排序,而无需TCP假定数据包丢失并进入缓慢启动。建议不要更改此数字。这是一个数据包重新排序检测指标,旨在最大程度地减少不必要的退避和重新传输,这些重新连接是由连接上的数据包重新排序引起的。
- tcp_retrans_collapse(Boolean; default: enabled; since Linux 2.2)
- 尝试在重传期间发送完整大小的数据包。
- tcp_retries1(integer; default: 3; since Linux 2.2)
- TCP将尝试正常地在已建立的连接上重传数据包的次数,而无需花费额外的精力来使网络层参与其中。一旦超过重传次数,我们将首先让网络层在每次新的重传之前更新路由。默认值为RFC指定的最小值3。
- tcp_retries2(integer; default: 15; since Linux 2.2)
- 在放弃之前,TCP报文在已建立状态下被重传的最大次数。默认值为15,这取决于重传超时,对应于大约13到30分钟之间的持续时间。 RFC 1122指定的100秒最小限制通常被认为太短。
- tcp_rfc1337(Boolean; default: disabled; since Linux 2.2)
- 启用符合RFC 1337的TCP行为。禁用时,如果以TIME_WAIT状态接收到RST,我们将立即关闭套接字,而无需等待TIME_WAIT周期的结束。
- tcp_rmem(since Linux 2.4)
This is a vector of 3 integers: [min, default, max].
These parameters are used by TCP to regulate receive buffer sizes.
TCP dynamically adjusts the size of the
receive buffer from the defaults listed below, in the range
of these values, depending on memory available in the system.- min
- 每个TCP套接字使用的接收缓冲区的最小大小。默认值为系统页面大小。 (在Linux 2.4上,默认值是4 kB,在低内存系统中降低到PAGE_SIZE字节。)此值用于确保在内存压力模式下,此大小以下的分配仍将成功进行。这不用于限制在套接字上使用SO_RCVBUF声明的接收缓冲区的大小。
- default
- TCP套接字的接收缓冲区的默认大小。此值将从为所有协议定义的通用全局net.core.rmem_default覆盖初始默认缓冲区大小。默认值为87380字节。 (在Linux 2.4上,在低内存系统中,该值将降至43689。)如果需要更大的接收缓冲区大小,则应增加该值(以影响所有套接字)。要使用较大的TCP窗口,必须启用net.ipv4.tcp_window_scaling(默认)。
- max
- 每个TCP套接字使用的接收缓冲区的最大大小。此值不会覆盖全局net.core.rmem_max。这不用于限制在套接字上使用SO_RCVBUF声明的接收缓冲区的大小。默认值使用公式计算
- 最大值(87380,最小值(4 MB,tcp_mem [1] * PAGE_SIZE / 128))
- (在Linux 2.4上,默认值为87380 * 2字节,在低内存系统中降低为87380)。
- tcp_sack(Boolean; default: enabled; since Linux 2.2)
- 启用RFC 2018 TCP选择性确认。
- tcp_slow_start_after_idle(Boolean; default: enabled; since Linux 2.6.18)
- 如果启用,请提供RFC 2861行为,并在空闲时间后使拥塞窗口超时。空闲时间段定义为当前RTO(重传超时)。如果禁用,则拥塞窗口在空闲时间后不会超时。
- tcp_stdurg(Boolean; default: disabled; since Linux 2.2)
- 如果启用此选项,则对TCP紧急指针字段使用RFC 1122解释。根据这种解释,紧急指针指向紧急数据的最后一个字节。如果禁用此选项,则对紧急指针使用BSD兼容的解释:紧急指针指向紧急数据之后的第一个字节。启用此选项可能会导致互操作性问题。
- tcp_syn_retries(integer; default: 6; since Linux 2.2)
- 活动TCP连接尝试的初始SYN的最大次数将被重传。该值不应大于255。默认值为6,这对应于重试最多约127秒。在Linux 3.7之前,默认值为5(结合基于其他内核参数的计算)大约为180秒。
- tcp_synack_retries(integer; default: 5; since Linux 2.2)
- 被动TCP连接的SYN / ACK段的最大传输次数。此数字不应大于255。
- tcp_syncookies(Boolean; since Linux 2.2)
- 启用TCP syncookie。内核必须使用CONFIG_SYN_COOKIES进行编译。当套接字的syn待办事项队列溢出时,发出syncookie。 syncookies功能试图保护套接字免受SYN泛洪攻击。如果有的话,这应该作为最后的手段。这违反了TCP协议,并且与TCP的其他区域(例如TCP扩展名)冲突。这可能会给客户端和中继造成问题。不建议将其作为重载服务器的调整机制来帮助解决过载或配置错误的情况。有关推荐的替代方法,请参见tcp_max_syn_backlog,tcp_synack_retries和tcp_abort_on_overflow。
- tcp_timestamps(integer; default: 1; since Linux 2.2)
Set to one of the following values to enable or disable RFC 1323
TCP timestamps:- 0
- 禁用时间戳。
- 1
- 启用RFC1323中定义的时间戳,并为每个连接使用随机偏移,而不是仅使用当前时间。
- 2
- 至于值1,但没有随机偏移。从Linux 4.10开始,将tcp_timestamps设置为该值很有意义。
- tcp_tso_win_divisor(integer; default: 3; since Linux 2.6.9)
- 此参数控制单个TCP Segmentation Offload(TSO)帧可以消耗多少百分比的拥塞窗口。此参数的设置是在突发性和构建更大的TSO帧之间的权衡。
- tcp_tw_recycle(Boolean; default: disabled; Linux 2.4 to 4.11)
- 启用TIME_WAIT套接字的快速回收。不建议启用此选项,因为远程IP可能不会使用单调递增的时间戳(NAT之后的设备,具有每个连接时间戳偏移的设备)。请参阅RFC 1323(PAWS)和RFC 6191。
- tcp_tw_reuse(Boolean; default: disabled; since Linux 2.4.19/2.6)
- 从协议角度来看,在安全的情况下,允许将TIME_WAIT套接字重新用于新连接。未经技术专家的建议/要求,不得更改。
- tcp_vegas_cong_avoid(Boolean; default: disabled; Linux 2.2 to 2.6.13)
- 启用TCP Vegas拥塞避免算法。 TCP Vegas是TCP的仅发送方更改,它通过估计带宽来预测拥塞的发生。 TCP Vegas通过修改拥塞窗口来调整发送速率。 TCP Vegas应该提供较少的数据包丢失,但是不像TCP Reno那样积极。
- tcp_westwood(Boolean; default: disabled; Linux 2.4.26/2.6.3 to 2.6.13)
- 启用TCP Westwood +拥塞控制算法。 TCP Westwood +是TCP Reno协议栈的仅发件人侧的修改,可优化TCP拥塞控制的性能。它基于端到端带宽估计来设置拥塞窗口和拥塞事件后的慢启动阈值。使用该估计,TCP Westwood +会自适应地设置慢启动阈值和拥塞窗口,该窗口考虑了发生拥塞时使用的带宽。 TCP Westwood +大大提高了有线网络中TCP Reno的公平性,并提高了无线链路的吞吐量。
- tcp_window_scaling(Boolean; default: enabled; since Linux 2.2)
- 启用RFC 1333 TCP窗口缩放。如果另一端支持,此功能允许在TCP连接上使用大窗口(>64 kB)。通常,TCP报头中的16位窗口长度字段将窗口大小限制为小于64 kB。如果需要更大的窗口,则应用程序可以增加其套接字缓冲区的大小,并且将使用窗口缩放选项。如果禁用了tcp_window_scaling,则在建立连接期间,TCP将不会与另一端协商使用窗口缩放。
- tcp_wmem(since Linux 2.4)
This is a vector of 3 integers: [min, default, max].
These parameters are used by TCP to regulate send buffer sizes.
TCP dynamically adjusts the size of the send buffer from the
default values listed below, in the range of these values,
depending on memory available.- min
- 每个TCP套接字使用的发送缓冲区的最小大小。默认值为系统页面大小。 (在Linux 2.4上,默认值为4 kB。)此值用于确保在内存压力模式下,低于此大小的分配仍将成功进行。这不用于限制在套接字上使用SO_SNDBUF声明的发送缓冲区的大小。
- default
- TCP套接字的发送缓冲区的默认大小。此值将从为所有协议定义的通用全局/ proc / sys / net / core / wmem_default覆盖初始默认缓冲区大小。默认值为16 kB。如果需要更大的发送缓冲区大小,则应增加该值(以影响所有套接字)。要使用较大的TCP窗口,必须将/ proc / sys / net / ipv4 / tcp_window_scaling设置为非零值(默认值)。
- max
- 每个TCP套接字使用的发送缓冲区的最大大小。此值不会覆盖/ proc / sys / net / core / wmem_max中的值。这不用于限制在套接字上使用SO_SNDBUF声明的发送缓冲区的大小。默认值使用公式计算
- 最大值(65536,最小值(4 MB,tcp_mem [1] * PAGE_SIZE / 128))
- (在Linux 2.4上,默认值为128kB,根据低内存系统的不同,默认值降低了64kB。)
- tcp_workaround_signed_windows(Boolean; default: disabled; since Linux 2.6.26)
- 如果启用,则假定未收到窗口缩放选项,则意味着远程TCP已损坏,并将窗口视为已签名数量。如果禁用,则即使我们没有从中接收到窗口缩放选项,也要假设远程TCP没有损坏。
Socket options
要设置或获取TCP套接字选项,请调用getsockopt(2)来读取或设置setsockopt(2)来写入选项级别参数设置为IPPROTO_TCP的选项。除非另有说明,否则optval是指向int的指针。此外,大多数IPPROTO_IP套接字选项在TCP套接字上有效。有关更多信息,请参见ip(7)。
以下是特定于TCP的套接字选项的列表。有关也适用于TCP套接字的某些其他套接字选项的详细信息,请参见socket(7)。
- TCP_CONGESTION(since Linux 2.6.13)
- 此选项的参数是字符串。此选项允许调用方在每个套接字的基础上设置要使用的TCP拥塞控制算法。非特权进程仅限于选择tcp_allowed_congestion_control中的算法之一(如上所述)。特权进程(CAP_NET_ADMIN)可以从任何可用的拥塞控制算法中进行选择(请参见上面对tcp_available_congestion_control的描述)。
- TCP_CORK(since Linux 2.2)
- 如果已设置,请不要发送局部帧。再次清除该选项时,将发送所有排队的部分帧。这对于在调用sendfile(2)之前添加标头或进行吞吐量优化很有用。按照当前的实现,TCP_CORK对输出进行软木塞的时间上限为200毫秒。如果达到此上限,则会自动传输排队的数据。仅从Linux 2.5.71开始,此选项才能与TCP_NODELAY结合使用。此选项不应在旨在可移植的代码中使用。
- TCP_DEFER_ACCEPT(since Linux 2.4)
- 仅当数据到达套接字时才允许唤醒侦听器。取一个整数值(秒),这可以限制TCP完成连接的最大尝试次数。此选项不应在旨在可移植的代码中使用。
- TCP_INFO(since Linux 2.4)
- 用于收集有关此套接字的信息。内核返回文件/usr/include/linux/tcp.h中定义的结构tcp_info。此选项不应在旨在可移植的代码中使用。
- TCP_KEEPCNT(since Linux 2.4)
- TCP在断开连接之前应发送的最大保持活动探测数。此选项不应在旨在可移植的代码中使用。
- TCP_KEEPIDLE(since Linux 2.4)
- 如果已在套接字上设置套接字选项SO_KEEPALIVE,则连接必须保持空闲状态的时间(以秒为单位),然后TCP才开始发送保持活动的探测。此选项不应在旨在可移植的代码中使用。
- TCP_KEEPINTVL(since Linux 2.4)
- 各个keepalive探针之间的时间(以秒为单位)。此选项不应在旨在可移植的代码中使用。
- TCP_LINGER2(since Linux 2.4)
- 孤立的FIN_WAIT2状态套接字的生存期。此选项可用于覆盖此套接字的文件/ proc / sys / net / ipv4 / tcp_fin_timeout中的系统范围设置。请勿将此与socket(7)级别的选项SO_LINGER混淆。此选项不应在旨在可移植的代码中使用。
- TCP_MAXSEG
- 传出TCP数据包的最大段大小。在Linux 2.2和更低版本以及Linux 2.6.28和更高版本中,如果在建立连接之前设置了此选项,则它还会将在初始数据包中声明给另一端的MSS值更改。大于(最终)接口MTU的值无效。 TCP还将在提供的值上施加其最小和最大界限。
- TCP_NODELAY
- 如果设置,请禁用Nagle算法。这意味着,即使只有少量数据,也总是尽快发送段。如果未设置,数据将被缓冲,直到有足够的数据量可以发送出去,从而避免了频繁发送小数据包,从而导致网络利用率低下。 TCP_CORK覆盖此选项;但是,即使当前设置了TCP_CORK,设置此选项也会强制显式刷新待处理的输出。
- TCP_QUICKACK(since Linux 2.4.4)
- 如果设置则启用快速模式,如果清除则禁用快速模式。在快速模式下,将立即发送确认,而不是根据常规TCP操作的需要发送延迟。该标志不是永久的,它仅允许切换到快速模式或从快速模式切换。 TCP协议的后续操作将再次进入/离开快速确认模式,具体取决于内部协议处理和诸如延迟确认超时和数据传输之类的因素。此选项不应在旨在可移植的代码中使用。
- TCP_SYNCNT(since Linux 2.4)
- 设置在中止尝试连接之前TCP应该发送的SYN重传次数。它不能超过255。不应在打算移植的代码中使用此选项。
- TCP_USER_TIMEOUT(since Linux 2.6.37)
- 此选项将unsigned int作为参数。当该值大于0时,它指定在TCP强制关闭相应的连接并将ETIMEDOUT返回给应用程序之前,传输的数据可能仍未确认的最长时间(以毫秒为单位)。如果选项值指定为0,则TCP将使用系统默认值。
- 用户超时的增加允许TCP连接在没有端到端连接的情况下可以存活更长的时间。如果需要,减少用户超时可以使应用程序"快速失败"。否则,在正常的WAN环境中,如果使用当前的系统默认值,则故障最多可能需要20分钟。
- 可以在TCP连接的任何状态下设置此选项,但是仅在连接的同步状态(ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING和LAST-ACK)下有效。 。此外,当与TCP keepalive(SO_KEEPALIVE)选项一起使用时,TCP_USER_TIMEOUT将覆盖keepalive以确定何时由于keepalive失败而关闭连接。
- 该选项对何时TCP重新传输数据包或何时发送保持活动探测无效。
- 与其他选项一样,此选项将由accept(2)返回的套接字继承,如果它是在侦听套接字上设置的。
- 有关用户超时功能的更多详细信息,请参见RFC793和RFC5482(" TCP用户超时选项")。
- TCP_WINDOW_CLAMP(since Linux 2.4)
- 将广告窗口的大小绑定到此值。内核施加的最小大小为SOCK_MIN_RCVBUF / 2。此选项不应在旨在可移植的代码中使用。
Sockets API
TCP以紧急数据(单个字节)的形式提供对带外数据的有限支持。在Linux中,这意味着如果另一端发送新的带外数据,则较旧的紧急数据将作为普通数据插入流中(即使未设置SO_OOBINLINE时)。这与基于BSD的堆栈不同。
Linux默认使用对紧急指针字段的BSD兼容解释。这违反了RFC 1122,但是与其他堆栈的互操作性是必需的。可以通过/ proc / sys / net / ipv4 / tcp_stdurg进行更改。
可以使用recv(2)MSG_PEEK标志来查看带外数据。
从2.4版开始,Linux支持在recv(2)(和recvmsg(2))的flags参数中使用MSG_TRUNC。该标志导致接收到的数据字节被丢弃,而不是传递给调用方提供的缓冲区。从Linux 2.4.4开始,与MSG_OOB结合使用以接收带外数据时,MSG_TRUNC也具有此效果。
Ioctls
以下ioctl(2)调用返回value中的信息。正确的语法是:
int value; error = ioctl(tcp_socket, ioctl_type, &value);
ioctl_type是以下之一:
- SIOCINQ
- 返回接收缓冲区中排队的未读数据量。套接字不得处于LISTEN状态,否则将返回错误(EINVAL)。 SIOCINQ在中定义。或者,您可以使用在中定义的同义词FIONREAD。
- SIOCATMARK
- 如果入站数据流处于紧急标记,则返回true(即value为非零)。
- 如果设置了SO_OOBINLINE套接字选项,并且SIOCATMARK返回true,则从套接字的下一次读取将返回紧急数据。如果未设置SO_OOBINLINE套接字选项,并且SIOCATMARK返回true,则从套接字的下一次读取将返回紧随紧急数据之后的字节(要实际读取紧急数据,需要recv(MSG_OOB)标志)。
- 请注意,读不会读过紧急标记。如果应用程序通过select(2)(使用exceptionfds参数)或通过传递SIGURG信号通知了紧急数据的存在,则它可以使用循环重复执行到标记,该循环反复测试SIOCATMARK并执行读取(请求任意数量的字节),只要SIOCATMARK返回false。
- SIOCOUTQ
- 返回套接字发送队列中未发送的数据量。套接字不得处于LISTEN状态,否则将返回错误(EINVAL)。 SIOCOUTQ在中定义。或者,您可以使用在中定义的同义词TIOCOUTQ。
Error handling
当发生网络错误时,TCP尝试重新发送数据包。如果一段时间后仍未成功,则会报告ETIMEDOUT或该连接上一次收到的错误。
某些应用程序需要更快的错误通知。可以使用IPPROTO_IP级别的IP_RECVERR套接字选项启用此功能。启用此选项后,所有传入的错误都会立即传递给用户程序。谨慎使用此选项---使TCP对路由更改和其他正常网络条件的容忍度降低。
错误说明
- EAFNOTSUPPORT
- 在sin_family中传递的套接字地址类型不是AF_INET。
- EPIPE
- 另一端意外关闭了套接字,或者在关闭的套接字上执行了读取操作。
- ETIMEDOUT
- 一段时间后,另一端未确认重新传输的数据。
为ip(7)或通用套接字层定义的任何错误也可能返回给TCP。
版本
2.4中引入了对显式拥塞通知,零拷贝sendfile(2),重新排序支持和某些SACK扩展(DSACK)的支持。在2.3中引入了对转发确认(FACK),TIME_WAIT回收和按连接的keepalive套接字选项的支持。
BUGS
并非所有错误都记录在案。
没有描述IPv6。
另外参见
accept(2),bind(2),connect(2),getsockopt(2),listen(2),recvmsg(2),sendfile(2),sendmsg(2),socket(2),ip(7),插座(7)
内核源文件Documentation / networking / ip-sysctl.txt。
TCP规范的RFC 793。
TCP要求的RFC 1122和Nagle算法的描述。
用于TCP时间戳和窗口缩放选项的RFC 1333。
RFC 1337中有关TIME_WAIT暗杀危险的描述。
RFC 3168,用于显式拥塞通知的描述。
用于TCP拥塞控制算法的RFC 2581。
用于SACK的RFC 2018和RFC 2883和SACK扩展。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。