Skip to content

Latest commit

 

History

History
95 lines (68 loc) · 3.07 KB

tcp.md

File metadata and controls

95 lines (68 loc) · 3.07 KB
拥塞算法
cat /proc/sys/net/ipv4/tcp_allowed_congestion_control
cat /proc/sys/net/ipv4/tcp_congestion_control
窗口扩展
cat /proc/sys/net/ipv4/tcp_window_scaling
  • 通告窗口: 发送数据的win,代表我这边能收多少的窗口,对方最多给我发多少
  • 拥塞窗口: 慢启动为发送方的TCP增加了另一个窗口:拥塞窗口 (congestion window),记为cwnd
  • 拥塞算法
    • 慢启动算法
    • 拥塞避免算法 reno tahoe vegas new_reno hybla
    • 快速恢复算法
      • 快速重传
  • RTT
    • jackbson
    • karn
  • Nagle : 小数据包合并 但在广域网上, 这些小分组则会增加拥塞出现的可能。
  • delayed ack:延时发送ack,从而合并ack(其他控制报文),减少包数量
  • 选择性确认(sack)— 接收方通知发送方,收到非连续数据块
  • 前向确认(fack)
  • 坚持定时器
    • win0 : 我这满了,你别发了
    • 对端什么时候发?对端会不断发ack(起坚持定时器),我会返回非0,这样,不会僵死

重复确认检测

 11 12 13 -> 
11 drop
 <- 11 11  响应12,13 — 我在等待11
 11 -> 
肯定确认 -> sliding window
等待期间也进行发送,利用带宽
-> 可变窗口

大的mss会导致分片,一分片,如果一个segment丢了,整个报文段都要重传

接收方发送的序号的含义:

这个序号如果为A,则表示告诉发送方:A-1我收到了,你发A吧

累积确认的bug:

100,101,102,103,104

100 丢失, 而101,102,103,104都到了,接收方返回的ack一直是101,导致发送方不知道这4个已经都收到了。

发送方超时重传,如果传了5个,则浪费了。

二义性:
RTT = 接收X的ACK时间 - 发送X时间
如果一个报文重传,则接收方无法判断是第一个还是第二个的到达时间,故RTT不准
二义性带来的问题:rtt算不准。
解决- karn 只用第一次的ack时间 * 重传次数

估计重传时间的意义:重传定时器尽可能接近RTT,只能大不能小

拥塞崩溃 congestion collapse
慢启动 slow start
启动新连接,拥塞恢复???
拥塞窗口 = 1,2,4,8 …。。。。。
拥塞避免 9、10,11 。。。 16

加速递减 multiplicative decrease

拥塞窗口界限 congestion window limit

发送方的拥塞窗口在丢包后调整
allowed window (允许发送包) = min(ack window值 , congestion window)

路由器尾部丢弃导致,当一个链接导致拥塞,会将所有的链接进入慢启动—> 路由器red

timewait的意义:能够辨别出是新连接还是旧连接,防止老的reset reset掉新的连接

push: 立即发送(telnet)

吞吐率:占用带宽

SWS糊涂窗口综合征? 
接收app每次只处理一个字节,导致发送方每次都发一个字节,退回到了一发一收状态,浪费带宽
接收方:delayed ack  
只有在可用缓冲区达到缓冲区一半 || 最长报文数据量 才发 —- 不推荐
只有窗口能避免此种情况时,才发
发送方:Nagle,如果刚发完,没有ack,则攒包, 如果ack来了,则发