WEB开发网
开发学院软件开发Java tcp connection setup的实现(三) 阅读

tcp connection setup的实现(三)

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: tcp_v4_connect的源码就不分析了,我这里只大概的介绍下他的流程: 1 判断地址的一些合法性. 2 调用ip_route_connect来查找出去的路由(包括查找临时端口等等). 3 设置sock的状态为TCP_SYN_SENT,并调用inet_hash_connect来查找一个临时端

tcp_v4_connect的源码就不分析了,我这里只大概的介绍下他的流程:

1 判断地址的一些合法性.

2 调用ip_route_connect来查找出去的路由(包括查找临时端口等等).

3 设置sock的状态为TCP_SYN_SENT,并调用inet_hash_connect来查找一个临时端口(也就是我们出去的端口),并加入到对应的hash链表(具体操作和get_port很相似).

4 调用tcp_connect来完成最终的操作.这个函数主要用来初始化将要发送的syn包(包括窗口大小isn等等),然后将这个sk_buffer加入到socket的写队列.最终调用tcp_transmit_skb传输到3层.再往下的操作就可以看我前面的blog了.

最后来看下3次握手的客户端的状态变化,还是看tcp_rcv_state_process函数,这里我们进来的socket假设就是TCP_SYN_SENT状态,也就是在等待syn和ack分节:

Java代码

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, 
   struct tcphdr *th, unsigned len) 
{ 
.......................................... 
 
 switch (sk->sk_state) { 
 case TCP_CLOSE: 
 goto discard; 
 
 case TCP_LISTEN: 
 .................................. 
 
 case TCP_SYN_SENT: 
///进入对应的状态机处理函数. 
 queued = tcp_rcv_synsent_state_process(sk, skb, th, len); 
 if (queued >= 0) 
  return queued; 
 
 /* Do step6 onward by hand. */ 
 tcp_urg(sk, skb, th); 
 __kfree_skb(skb); 
 tcp_data_snd_check(sk); 
 return 0; 
 }

上一页  2 3 4 5 6 7 8  下一页

Tags:tcp connection setup

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接