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

tcp connection setup的实现(一)

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 在看listen的代码之前.我们也先来看相关的数据结构: 其中inet_connection_sock我们先前已经介绍过了,它包含了一个icsk_accept_queue的域,这个域是一个request_sock_queue类型,.我们就先来看这个结构: request_sock_queue也就

在看listen的代码之前.我们也先来看相关的数据结构:

其中inet_connection_sock我们先前已经介绍过了,它包含了一个icsk_accept_queue的域,这个域是一个request_sock_queue类型,.我们就先来看这个结构:

request_sock_queue也就表示一个request_sock队列.这里我们知道,tcp中分为半连接队列(处于 SYN_RECVD状态)和已完成连接队列(处于established状态).这两个一个是刚接到syn,等待三次握手完成,一个是已经完成三次握手, 等待accept来读取.

这里每个syn分节到来都会新建一个request_sock结构,并将它加入到listen_sock的request_sock hash表中.然后3次握手完毕后,将它放入到request_sock_queue的rskq_accept_head和 rskq_accept_tail队列中.这样当accept的时候就直接从这个队列中读取了.

Java代码

struct request_sock_queue { 
///一个指向头,一个指向结尾. 
 struct request_sock *rskq_accept_head; 
 struct request_sock *rskq_accept_tail; 
 rwlock_t syn_wait_lock; 
 u8  rskq_defer_accept; 
 /* 3 bytes hole, try to pack */ 
///相应的listen_socket结构. 
 struct listen_sock *listen_opt; 
};

listen_sock 表示一个处于listening状态的socket.

Java代码

struct listen_sock { 
///log_2 of maximal queued SYNs/REQUESTs ,这里不太理解这个域的作用. 
 u8  max_qlen_log; 
 /* 3 bytes hole, try to use */ 
///当前的半连接队列的长度. 
 int  qlen; 
///也是指当前的半开连接队列长度,不过这个值会当重传syn/ack的时候(这里要注意是这个syn/ack第一次重传的时候才会减一)自动减一. 
 int  qlen_young; 
 int  clock_hand; 
 u32  hash_rnd; 
///这个值表示了当前的syn_backlog(半开连接队列)的最大值 
 u32  nr_table_entries; 
///半连接队列. 
 struct request_sock *syn_table[0]; 
};

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

Tags:tcp connection setup

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