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

tcp connection setup的实现(二)

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 可以看到最终会调用tcp_v4_conn_request来处理syn分组,我们接下来就来看这个函数的实现. 先来看几个相关的函数,第一个是reqsk_queue_is_full,他来判断半连接队列是否已满.其实实现很简单,就是判断qlen和max_qlen_log的大小: Java代码 stat

可以看到最终会调用tcp_v4_conn_request来处理syn分组,我们接下来就来看这个函数的实现.

先来看几个相关的函数,第一个是reqsk_queue_is_full,他来判断半连接队列是否已满.其实实现很简单,就是判断qlen和max_qlen_log的大小:

Java代码 static inline int reqsk_queue_is_full(const struct request_sock_queue *queue) 
{ 
 return queue->listen_opt->qlen >> queue->listen_opt->max_qlen_log; 
}

第二个是sk_acceptq_is_full,它用来判断accept队列是否已满.这个也是很简单,比较当前的队列大小sk_ack_backlog与最大的队列大小sk_max_ack_backlog.

Java代码

static inline int sk_acceptq_is_full(struct sock *sk) 
{ 
 return sk->sk_ack_backlog > sk->sk_max_ack_backlog; 
}

最后一个是tcp_openreq_init,它用来新建一个inet_request_sock,我们知道每次一个syn到达后,我们都会新建一个inet_request_sock,并加入到半连接队列.

Java代码

static inline void tcp_openreq_init(struct request_sock *req, 
    struct tcp_options_received *rx_opt, 
    struct sk_buff *skb) 
{ 
 struct inet_request_sock *ireq = inet_rsk(req); 
 
 req->rcv_wnd = 0; /* So that tcp_send_synack() knows! */ 
 req->cookie_ts = 0; 
 tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq; 
 req->mss = rx_opt->mss_clamp; 
 req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0; 
 ireq->tstamp_ok = rx_opt->tstamp_ok; 
 ireq->sack_ok = rx_opt->sack_ok; 
 ireq->snd_wscale = rx_opt->snd_wscale; 
 ireq->wscale_ok = rx_opt->wscale_ok; 
 ireq->acked = 0; 
 ireq->ecn_ok = 0; 
 ireq->rmt_port = tcp_hdr(skb)->source; 
}

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

Tags:tcp connection setup

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