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

Create new connections tcp_v4_do_rcv() tcp_rcv_state_process() tcp_rcv_synsent_state_process() Client: SYN-ACK / ACK 如果是 SYN_SENT 状态,就继续处理 如果处理失败返回 tcp_v4_do_rcv() ,从而导致发送RST 解析 TCP options 如果ACK标志置位 { 检查 ACK 的序号与 snd_nxt 是否相同 timestamp 检查 RST? 有没有 SYN? 更新 window /scaling factor / timestamp 初始化 TCP MTUP/MSS/rcv MSS/ 设置 ESTABLISHED 状态 拥塞避免处理初始化 发送 ACK }

tcp_v4_do_rcv() Create new connections 如果是 LISTEN 状态 如果 tcp_v4_hnd_req() 创建 了新的 socket tcp_v4_hnd_req() tcp_child_process() Server: Recv ACK 搜索是否有匹配的 req ,若找到就调用 tcp_check_req() , 这个函数完成了: 1. 解析 TCP options 2. RFC793 的其余检查 3. 调用 tcp_v4_syn_recv_sock() 创建新 socket , 这个 socket 状态是 SYN_RECV ,大部分状态从父 socket 复制而来 4. 将 req 从 request queue 中删除,加入到 accept queue 中 1. 调用 tcp_rcv_state_process() 处理 处于 SYN_RECV 状态的新 socket: 1.1 设置状态 ESTABLISHED 1.2 更新各种 TCP 内部状态 2. 唤醒处于休眠状态的进程( accept() syscall )

tcp_v4_do_rcv()<br />

Create new connections<br />

如果是 LISTEN 状态<br />

如果<br />

tcp_v4_hnd_req()<br />

创建<br />

了新的 socket<br />

tcp_v4_hnd_req()<br />

tcp_child_process()<br />

Server: Recv ACK<br />

搜索是否有匹配的 req ,若找到就调用 tcp_check_req() ,<br />

这个函数完成了:<br />

1. 解析 <strong>TCP</strong> options<br />

2. RFC793 的其余检查<br />

3. 调用 tcp_v4_syn_recv_sock() 创建新 socket ,<br />

这个 socket 状态是 SYN_RECV ,大部分状态从父 socket 复制而来<br />

4. 将 req 从 request queue 中删除,加入到 accept queue 中<br />

1. 调用 tcp_rcv_state_process() 处理<br />

处于 SYN_RECV 状态的新 socket:<br />

1.1 设置状态 ESTABLISHED<br />

1.2 更新各种 <strong>TCP</strong> 内部状态<br />

2. 唤醒处于休眠状态的进程( accept() syscall )

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

Saved successfully!

Ooh no, something went wrong!