Inside Linux TCP stack: Overview
Inside Linux TCP stack: Overview Inside Linux TCP stack: Overview
tcp_sendmsg Key features: Tx data 计算发送超时 , 可用的 MSS 大小; 检查连接是否处于已连接/半连接状态; 检查连接是否已经 shutdown 从发送队列中取最后一个 skb , 如果没有这样 skb ,或者这个 skb 没有空闲空间就分配一个新的 skb 如果没有空闲内存,就进入休眠状态,等待空闲内存数量可用 将新分配的 skb 加入到发送队列尾部 向 skb 内复制数据,其间可能涉及到 linear area 和 fragmented area 如果写入的数据距上次 push 的 SEQ 大于 max_window/2 个字节了, 就将写入的 push 出去 如果发送的 seg ,就是正要发送的 seg ,直接 push 它 复制完所有数据之后,根据 NAGLE 和 max_window/2 条件判断是否 push
tcp_write_xmit() Key features: Tx data 尝试捎带发送 MTUP 遍历发送队列,发送数据直到违反发送条件 检查是否超过拥塞窗口/发送窗口 如果只有一个 seg ,进行 nagle 检查 如果不是 push 出来的SEG,为了降低TSO分拆 SEG的代价,检查是否可以延缓发包 tcp_transmit_skb() 调整发送队列 重置重传队列
- Page 1 and 2: Inside Linux TCP stack: Overview Li
- Page 3 and 4: Key components Applications System
- Page 5 and 6: RFC documents review - Terms +-+-+-
- Page 7 and 8: TCP protocol review - RFC 793 : TR
- Page 9 and 10: Client vs Server Create new connect
- Page 11 and 12: Create new connections tcp_v4_do_rc
- Page 13: tcp_v4_do_rcv() Create new connecti
- Page 17 and 18: Rx Data: from system call Key featu
- Page 19: Pending questions
tcp_sendmsg<br />
Key features: Tx data<br />
计算发送超时 , 可用的 MSS 大小;<br />
检查连接是否处于已连接/半连接状态;<br />
检查连接是否已经 shutdown<br />
从发送队列中取最后一个 skb ,<br />
如果没有这样 skb ,或者这个 skb 没有空闲空间就分配一个新的 skb<br />
如果没有空闲内存,就进入休眠状态,等待空闲内存数量可用<br />
将新分配的 skb 加入到发送队列尾部<br />
向 skb 内复制数据,其间可能涉及到 linear area 和 fragmented area<br />
如果写入的数据距上次 push 的 SEQ 大于 max_window/2 个字节了,<br />
就将写入的 push 出去<br />
如果发送的 seg ,就是正要发送的 seg ,直接 push 它<br />
复制完所有数据之后,根据 NAGLE 和 max_window/2 条件判断是否 push