Inside Linux TCP stack: Overview

Inside Linux TCP stack: Overview Inside Linux TCP stack: Overview

blog.chinaunix.net
from blog.chinaunix.net More from this publisher
02.07.2013 Views

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() 调整发送队列 重置重传队列

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!