sack dsack 相关介绍
之前做过关于 sack dsack相关笔记:tcp dsack
其实关于sack的不好之处 也是比较明显的:在一定程度上来说,SACK可能就像DOS攻击一样,每次遍历都要消耗大量CPU,时间复杂度为O(n^2),n为packets in flight的数量。
SACK Advantages
- Receiver informs the sender about all the PDUs that have been received successfully.
- Sender retransmits only the PDUs that have not been Acked.
- Implemented using two TCP options.
SACK –Permitted Option
- First option: enabling option(2 bytes) sent in a SYN
- Indicates SACK option can be used once connection established
- ---Receiver may return SACK’s
- ----Sender can process SACK’s
SACK Rules
- SACK does not change the meaning of ACK field.
- SACK cannot be sent unless SACK permitted option has been received.
- If SACKs are sent, they should be included in all TCP-PDUs when out-of-order data has been buffered.
- First SACK must ack most recently received out-of-order PDU.
SACK Rules Receiver
- Receiver returns as many distinct SACKs as possible.
- SACK option is filled out by repeating most recently reported SACK blocks.
- There may be some data in receiver’s queue which should be SACKed but is not.
SACK Rules Sender
- Records the SACK for future reference.
- Maintains a retransmission queue containing unacknowledged PDUs.
- Turns SACK bit on when sender receives a SACK.
- Skips SACK PDUs during retransmission.
- Retransmits the PDUs not SACKed so far and less than the highest SACKed PDU.
- Turns off SACK bit after retransmission time out.
Reneging
- Reneging is a case when the receiver SACK some data and later discards that data. Such discarding is discouraged, but permitted if the receiver runs out of the buffer space.
If Reneging occurs
- The first SACK should reflect the newest PDU even if the PDU is going to be discarded.
- Except for the newest PDU, all SACK blocks must not Ack any data which is no longer held by receiver.
Consequences of Reneging
- Sender must maintain normal TCP timeouts. A PDU cannot be considered acknowledged until its ACK by cumulative acknowledgement.
- PDU’s cannot be removed from the transmit buffer until ACK by the cumulative acknowledgement.
Duplicate SACK (DSACK)Extension to SACK
- When D-SACK is used, the first block of the SACK option should specify the duplicate PDU.
- D-SACK block is used to report duplicate contiguous sequence of data received by the receiver in the most recent packet.
- Each duplicate is reported at most once.
- Allows the sender TCP to determine when a retransmission is not necessary.
D-SACK TCP Rules
- If D-SACK block reports duplicate PDU from (possibly larger) block of data in the receiver buffer above the cumulative acknowledgement, the second SACK block (the first non D-SACK block) should specify this block.
- As only, the first SACK block is considered as D-SACK block, if multiple sequences are duplicated, only the first is contained in the D-SACK block.
D-SACK TCP & Retransmissions
- D-SACK allows TCP to determine when retransmission is not necessary and thereby undo congestion control measures.
- D-SACK allows TCP to determine if the network is duplicating packets.
- D-SACK does not allow a sender to determine if both the original and retransmitted PDU are received, or the original is lost and the retransmitted PDU is duplicated by the network.
SACK & D-SACK Interaction
- No difference between SACK & D-SACK, except that first SACK block is used to report a duplicate PDU in D-SACK.
- No separate negotiation/options for D-SACK.
- D-SACK is compatible with current implementations of SACK option in TCP.
参考:
- ftp://ftp.rfc-editor.org/in-notes/rfc2018.txt
- ftp://ftp.rfc-editor.org/in-notes/rfc2883.txt
- Professor Amer’s Slide
- http://www.cse.nd.edu/~surendar/teach/spr03/cse598N/Lectures/Lecture13.pdf
以上可以在内容来自https://www.eecis.udel.edu/~amer/856/sack.04f.ppt
引入D-SACK的目的是使TCP进行更好的流控,具体来说有以下几个好处:
1. 让发送方知道,是发送的包丢了,还是返回的ACK包丢了;
2. 网络上是否出现了包失序;
3. 数据包是否被网络上的路由器复制并转发了
4. 是不是自己的timeout太小了,导致重传
通过D-SACK这种方法,发送方可以更仔细判断出当前网络的传输情况,可以发现数据段被网络复制、错误重传、ACK丢失引起的重传、重传超时等异常的网络状。
D-SACK使用了SACK的第一个段来做标志,如何判断D-SACK:
1. 如果SACK的第一个段的范围被ACK所覆盖,那么就是D-SACK
2. 如果SACK的第一个段的范围被SACK的第二个段覆盖,那么就是D-SACK
D-SACK的规则如下:
1. 第一个block将包含重复收到的报文段的序号 2. 跟在D-SACK之后的SACK将按照SACK的方式工作 3. 如果有多个被重复接收的报文段,则D-SACK只包含其中第一个