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

tcp connection setup的实现(二)

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 可以看到当进来之后,会通过判断socket的不同状态来进入不同的处理.这里其实就分了3种状态,TCP_ESTABLISHED,TCP_LISTEN和剩余的的状态. 我们这里先不分析TCP_ESTABLISHED. 我们先来看当第一个syn分解到达后,内核会做怎么样处理.首先它会进入tcp_v4_

可以看到当进来之后,会通过判断socket的不同状态来进入不同的处理.这里其实就分了3种状态,TCP_ESTABLISHED,TCP_LISTEN和剩余的的状态.

我们这里先不分析TCP_ESTABLISHED.

我们先来看当第一个syn分解到达后,内核会做怎么样处理.首先它会进入tcp_v4_hnd_req函数,这个函数我们后面会处理,这里只需要知道当为第一个syn分节时,它会返回当前socket.因此此时nsk == sk,所以我们进入tcp_rcv_state_process函数,这个函数处理除了ESTABLISHED和TIME_WAIT状态之外的所有状态.

我们这里只看他的listen状态处理,后面的话也是遇到一个状态,我们看一个状态的处理:

Java代码  

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, 
   struct tcphdr *th, unsigned len) 
{ 
 struct tcp_sock *tp = tcp_sk(sk); 
///取得对应的inet_connection_sock . 
 struct inet_connection_sock *icsk = inet_csk(sk); 
 int queued = 0; 
 tp->rx_opt.saw_tstamp = 0; 
 
 switch (sk->sk_state) { 
 case TCP_LISTEN: 
///当为ack分节,则返回1,而对应内核会发送一个rst给对端. 
 if (th->ack) 
  return 1; 
///如果是rst,则忽略这个分组. 
 if (th->rst) 
  goto discard; 
///是syn分组,因此调用对应的虚函数conn_request,而这个函数在tcpv4中被初始化为tcp_v4_conn_request. 
 if (th->syn) { 
  if (icsk->icsk_af_ops->conn_request(sk, skb) < 0) 
  return 1; 
  kfree_skb(skb); 
  return 0; 
 } 
 goto discard; 
............................................................ 
}

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

Tags:tcp connection setup

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