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

tcp connection setup的实现(二)

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 而tcp_v4_hnd_req的主要工作是在半连接队列中看是否存在当前的socket,如果存在则说明这个有可能是最终的ack包,因此将会做一系列的合法性校验(比如重传,rst,syn等等),最终确定这个是ack后会调用对应的新建socket的虚函数syn_recv_sock. Java代码sta

而tcp_v4_hnd_req的主要工作是在半连接队列中看是否存在当前的socket,如果存在则说明这个有可能是最终的ack包,因此将会做一系列的合法性校验(比如重传,rst,syn等等),最终确定这个是ack后会调用对应的新建socket的虚函数syn_recv_sock.

Java代码  

static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb) 
{ 
 struct tcphdr *th = tcp_hdr(skb); 
 const struct iphdr *iph = ip_hdr(skb); 
 struct sock *nsk; 
 struct request_sock **prev; 
///通过socket,查找对应request_sock 
 struct request_sock *req = inet_csk_search_req(sk, &prev, th->source, 
       iph->saddr, iph->daddr); 
 if (req) 
///如果存在则进入req的相关处理. 
 return tcp_check_req(sk, skb, req, prev); 
 
///不存在,则通过inet_lookup_established查找.这是因为有可能当我们进入这个函数之前,socket的状态被改变了,也就是这个socket的状态已经不是listen了. 
 
 nsk = inet_lookup_established(sock_net(sk), &tcp_hashinfo, iph->saddr, 
  th->source, iph->daddr, th->dest, inet_iif(skb)); 
 
 if (nsk) { 
 if (nsk->sk_state != TCP_TIME_WAIT) { 
///非tw状态返回新的socket. 
  bh_lock_sock(nsk); 
  return nsk; 
 } 
///如果是timewait状态则返回空. 
 inet_twsk_put(inet_twsk(nsk)); 
 return NULL; 
 } 
 
#ifdef CONFIG_SYN_COOKIES 
 if (!th->rst && !th->syn && th->ack) 
 sk = cookie_v4_check(sk, skb, &(IPCB(skb)->opt)); 
#endif 
 return sk; 
}

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

Tags:tcp connection setup

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