tcp connection setup的实现(一)
2009-09-10 00:00:00 来源:WEB开发网在看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];
};
Tags:tcp connection setup
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接