场景
考虑一个场景,tcp发动端连续发送了4个包1-200,201-300,301-400,401-500. 接收端接收了1-200, 201-300,401-500。由于301-400没有收到,所以接收端只能发送一个ack 301给发送端,以确认1-300都收到,而401-500无法给发送端确认。这时发送端不知道301-400和401-500这两个包是否到达接收端。
解决办法
处理这种情况有两种可能的方式:
仅重传超时片段:这是一种更加保守的方式,仅重传超时的片段,希望其他片段都能够成功接收。但因为发送端没法确认200后到底有多少片段没被接收,情况就比较复杂。如果该片段之后的其他片段实际上接收到了,这一方式是最佳的。如果没接收到,就无法正常执行,这时后面的每一个片段需要单独计时并重传。
重传所有片段:这是一种更激进或者说更悲观的方式。无论何时一个片段超时了,不仅重传该片段,还有所有其他尚未确认的片段(301-400和401-500都会重传)。这一方式确保了任何时间都有一个等待确认的停顿时间,在所有未确认片段丢失的情况下,会刷新全部未确认片段,以使对端设备多一次接收机会。这种方式的问题在于可能这些重传是不必要的。如果第一个片段丢失而后面其他片段都接收到了,也得重传所有片段。
由于TCP不知道其他片段是否接收到,所以它也无法确认哪种方法更好,但只能选择一种方式
最优解决方式
tcpdump抓包时,在sync协商阶段可以看到一个“sackOK”的字段。
10:37:02.939789 IP 10.138.226.167.17198 > 10.139.252.110.9360: Flags S, seq 986305541, win 14600, options mss 1460,nop,nop,sackOK, length 0
这个位叫做选择确认(selective acknowledgment, SACK)。
它就用来处理上面的问题,即在TCP确认机制中,无法有效处理非连续TCP片段的问题。
但前提是连接的两方设备必须同时支持这一功能,通过连接时使用的SYN片段来协商是否允许SACK(即抓包中显示的sackOK)。这一过程完成之后,任一设备都可以在常规TCP片段中使用SACK选项。这一选项包含一个关于已接收但未确认片段数据sequence number范围的列表,如果某个片段已被选择确认过,则该片段中的SACK比特位置为1。该方式使用激进方式的改进版本,一个片段重传之后,之后所有片段也会重传,除非SACK比特位为1。
例如,在示例中4个片段的情况下,当接收端发回ack为301(1-200,201-300)的确认信息,其中包含一个SACK选项指明:“已接收到字节401至500,但尚未确认”。如果片段4在片段1和2之后到达,上述信息也可以通过一个单独的ack确认片段来完成。服务器确认片段4的字节范围,并为片段4打开SACK位。当片段3重传时,服务器看到片段4的SACK位为1,就不会对其重传。
在片段3重传之后,片段4的SACK位被清除。这是为了防止客户端出于某种原因改变片段4已接收的想法。客户端应当发送确认号为501或更高的确认信息,正式确认片段3和4接收到。如果这一情况没有发生,服务器必须接收到片段4的另一条选择确认信息才能将它的SACK位打开,否则,在片段3重传时或计时器超时的情况下会对其自动重传。
相关推荐
TCP SACK是一种选择性确认机制,用于提高TCP协议在数据包丢失情况下的性能。在传统的TCP中,接收方只能通过重复发送同一序列号的ACK来通知发送方某些数据包丢失,这可能导致发送方错误地认为网络拥塞而减少发送速率...
* tcp_sack:控制 TCP 连接的选择确认机制,影响数据传输的可靠性。 * tcp_timestamps:控制 TCP 连接的时间戳机制,影响数据传输的同步性。 二、调整 TCP 参数提高服务器性能 通过调整 TCP 参数,可以提高服务器...
- 确定是否启用窗口缩放(`window_scaling_enabled`)、选择性确认(SACK,`sack_enabled`)等功能。 - 指定是否支持Nagle算法(`nagle_support`)和Karn算法(`karns_algo_enabled`)。 - 设置重传模式(`max_...
6. **TCP选项**:如MSS(最大段大小)、SACK(选择性确认)和WSA(窗口缩放因子)等,这些可以优化TCP性能。 7. **TCP状态转换图**:展示TCP连接从建立到结束期间经历的各种状态,如CLOSED、LISTEN、SYN_SENT、SYN_...
TCP头可以包含可选的扩展选项,如最大段大小(MSS)、选择性确认(SACK)、时间戳等。MSS告诉对方每个数据段的最大尺寸,有助于避免IP分片。SACK允许接收方指定哪些段被丢失,以便发送方重新发送。时间戳则用于精确...
分析工作开始之前需要对Linux内核进行准备,了解用户层的TCP工作原理是基础,这包括对RFC文档的阅读,如RFC793定义了传输控制协议的基本规则,RFC1323介绍了TCP的高性能扩展,RFC2018讨论了TCP的选择性确认(SACK)...
8. **TCP选项**:TCP头中包含多个可选字段,如MSS(最大段大小)、Timestamps用于计算往返时间(RTT)和防止序号回绕,SACK(选择性确认)允许接收端告诉发送端哪些数据段未收到。 9. **性能调优**:在Linux中,...
这些选项提供了额外的功能,例如最大分段大小(MSS)、窗口扩展(Window Scale)、时间戳(Timestamps)和选择性确认(SACK)等。下面我们将详细介绍这些TCP选项。 #### 三、TCP常用选项详解 - **MSS (Maximum ...
4. RFC2018提出了TCP选择性确认(SACK),允许接收方仅确认收到的数据段,提高了恢复丢失数据的效率。 5. RFC2525列举了已知的TCP实现问题,为开发者提供了避免错误的指南。 6. RFC3168添加了IP中的显式拥塞通知...
TCP头部包含一些可选字段,如最大报文段长度(MSS)、窗口扩大因子、选择确认(SACK)等,这些选项可以用来优化TCP性能。例如,适当地设置MSS可以减少IP分片,提高网络效率;SACK允许接收方选择确认某些丢失的数据段...
9. **高级主题**:涵盖了TCP连接的复用、TCP Keepalive、TCP SACK(选择确认)等高级特性,以及IPv6的相关知识。 10. **网络安全**:简要介绍网络安全方面的考虑,如SSL/TLS加密通信,以及防止DDoS攻击的策略。 ...
TCP头部包含可选字段,如最大段大小(MSS)、时间戳、选择确认(SACK)等,用于优化性能或提供额外的可靠性。同时,TCP头部有一个16位的校验和,用于检测传输过程中可能发生的错误。 9. **TCP的拥塞窗口与慢启动...
除了传统的基于重复ACK和重传定时器的丢包检测方法外,还可以引入选择确认(SACK)等机制来更准确地检测丢包,从而更快地做出响应。 - **拥塞窗口调整机制**:传统的拥塞窗口调整机制(AI-MD)虽然简单有效,但在高速...
拥塞避免,快速重传的机制,但是 SACK 关注的是一个窗口内多个数据包丢失的情况,它避免了之前版本的 TCP重传一个窗口内所有数据包的情况,包括那些已经被接收端正确接收的数据包,而只是选择性地重传那些被丢弃的...
6. **选项与扩展**:TCP支持多种选项,如最大段大小(MSS)、窗口缩放、选择确认(SACK)等,这些选项可以提高TCP的性能和适应性。 7. **TCP连接的释放**:TCP连接的关闭遵循四次挥手的过程,确保双方都能正常结束...
因此,不断有新的优化技术出现,如快速重传、快速恢复、SACK(选择性确认)等,以提高TCP的性能。此外,TCP也被广泛应用于各种网络服务,如HTTP、HTTPS、FTP、SMTP等。 总结来说,TCP协议是互联网中的基石,其可靠...
在 Wireshark 中,可以根据需要捕获网络流量,选择合适的过滤器,查看包的详细信息,例如序号、确认号、标志位、窗口大小、校验和、选项等。 Wireshark 的使用可以帮助用户了解网络协议的工作机制,检测网络故障,...
为了解决上述问题,《RFC 2018》提出了选择性确认(SACK)机制,这是一种更为高效的确认机制,它可以显著提高TCP在网络条件不佳时的性能。 **SACK的工作原理:** 1. **SACK选项的添加:** 在TCP数据段中增加了一个...