TCP包的处理流程

接收:

ip_local_deliver

tcp_v4_rcv() (tcp_ipv4.c)→_tcp_v4_lookup()

tcp_v4_do_rcv(tcp_ipv4.c)→tcp_rcv_state_process  (OTHER STATES)

↓Established

tcp_rcv_established(tcp_in→tcp_ack_snd_check,(tcp_data_snd_check,tcp_ack (tcp_input.c)    

↓         ↓                  ↓                         ↓

tcp_data                       tcp_send_ack               tcp_write_xmit 

↓ (slow)  ↓(Fast)                         ↓

tcp_data_queue                             tcp_transmit_skb

↓         ↓                                   ↓

sk->data_ready (应用层)                              ip_queque_xmit

 

发送:

send

tcp_sendmsg

__tcp_push_pending_frames       tcp_write_timer

↓                            ↓

tcp_ retransmit_skb

tcp_transmit_skb     

ip_queue_xmit

TCP段的接收

_tcp_v4_lookup()用于在活动套接字的散列表中搜索套接字或SOCK结构体。

tcp_ack (tcp_input.c)用于处理确认包或具有有效ACK号的数据包的接受所涉及的所有任务:

调整接受窗口(tcp_ack_update_window()

删除重新传输队列中已确认的数据包(tcp_clean_rtx_queue()

对零窗口探测确认进行检查

调整拥塞窗口(tcp_may_raise_cwnd()

重新传输数据包并更新重新传输计时器

tcp_event_data_recv()用于处理载荷接受所需的所有管理工作,包括最大段大小的更新,时间戳的更新,延迟计时器的更新。

 

tcp_data_snd_check(sk)检查数据是否准备完毕并在传输队列中等待,且它会启动传输过程(如果滑动窗口机制的传输窗口和拥塞控制窗口允许的话),实际传输过程由tcp_write_xmit()启动的。(这里进行流量控制和拥塞控制)

 

tcp_ack_snd_check()用于检查可以发送确认的各种情形,同样它会检查确认的类型(它应该是快速的还是应该被延迟的)。

 tcp_fast_parse_options(sk,th,tp)用于处理TCP数据包报头中的Timestamp选项。

 

tcp_rcv_state_process()用于在TCP连接不处在ESTABLISHED状态的时候处理输入段。它主要用于处理该连接的状态变换和管理工作。

 

Tcp_sequence()通过使用序列号来检查所到达的数据包是否是无序的。如果它是一个无序的数据包,测激活QuickAck模式,以尽可能快地将确认发送出去。

 

Tcp_reset()用来重置连接,且会释放套接字缓冲区。

 

the end

评论(0)