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

tcp connection setup的实现(二)

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: tcp_hashinfo我们前面也已经分析过了,包含了所有tcp所用到的hash信息,比如socket,port等等.这里的查找其实就是在tcp_hashinfo中(其实是它的域ehash或者listening_hash)查找相应的socket. 我们可以看到内核在这里进行了两次查找,首先是在e

tcp_hashinfo我们前面也已经分析过了,包含了所有tcp所用到的hash信息,比如socket,port等等.这里的查找其实就是在tcp_hashinfo中(其实是它的域ehash或者listening_hash)查找相应的socket.

我们可以看到内核在这里进行了两次查找,首先是在established状态的socket中查找,处于established状态,说明3次握手已经完成,因此这个socket可以通过简单的4元组hash在hashinfo的ehash中查找.

而当在__inet_lookup_established中没有找到时,则将会__inet_lookup_listener中查找.也就是在处于listening状态的socket中查找(这里主要是通过daddr也就是目的地址来进行匹配).

当找到对应的socket以后就会进入数据包的处理,也就是进入tcp_v4_do_rcv函数.

Java代码

int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) 
{ 
 struct sock *rsk; 
.................................................. 
 
///如果为TCP_ESTABLISHED状态,则进入相关处理 
 if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ 
 TCP_CHECK_TIMER(sk); 
 if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) { 
  rsk = sk; 
  goto reset; 
 } 
 TCP_CHECK_TIMER(sk); 
 return 0; 
 } 
 
///进行包头的合法性校验. 
 if (skb->len < tcp_hdrlen(skb) || tcp_checksum_complete(skb)) 
 goto csum_err; 
///进入TCP_LISTEN状态. 
 if (sk->sk_state == TCP_LISTEN) { 
 struct sock *nsk = tcp_v4_hnd_req(sk, skb); 
 if (!nsk) 
  goto discard; 
 
 if (nsk != sk) { 
  if (tcp_child_process(sk, nsk, skb)) { 
  rsk = nsk; 
  goto reset; 
  } 
  return 0; 
 } 
 } 
 
 TCP_CHECK_TIMER(sk); 
///进入其他状态的处理.除了ESTABLISHED和TIME_WAIT状态. 
 if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len)) { 
 rsk = sk; 
 goto reset; 
 } 
 TCP_CHECK_TIMER(sk); 
 return 0; 
...................................................................... 
}

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

Tags:tcp connection setup

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接