Inside Linux TCP stack: Overview
Inside Linux TCP stack: Overview Inside Linux TCP stack: Overview
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 )
- 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: Create new connections tcp_v4_do_rc
- Page 15 and 16: tcp_write_xmit() Key features: Tx d
- Page 17 and 18: Rx Data: from system call Key featu
- Page 19: Pending questions
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 )