tcp connection setup的实现(一)
2009-09-10 00:00:00 来源:WEB开发网struct inet_ehash_bucket管理所有的tcp状态在TCP_ESTABLISHED和TCP_CLOSE之间的socket.这里要注意,twchain表示处于TIME_WAIT的socket.
Java代码
struct inet_ehash_bucket {
struct hlist_head chain;
struct hlist_head twchain;
};
inet_bind_bucket结构就是每个使用的端口的信息,最终会把它链接到bhash链表中.
Java代码
struct inet_bind_bucket {
struct net *ib_net;
///端口号
unsigned short port;
///表示这个端口是否能够被重复使用.
signed short fastreuse;
///指向下一个端口的inet_bind_bucket 结构.
struct hlist_node node;
///也就是使用这个端口的socket链表
struct hlist_head owners;
};
最后一个结构是tcp_hashinfo他在 tcp_init中被初始化,而tcp_init是在inet_init中被初始化的.然后tcp_hashinfo会被赋值给tcp_proto和sock的sk_prot域.
Java代码
struct inet_hashinfo __cacheline_aligned tcp_hashinfo = {
.lhash_lock = __RW_LOCK_UNLOCKED(tcp_hashinfo.lhash_lock),
.lhash_users = ATOMIC_INIT(0),
.lhash_wait = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait),
};
然后来看bind的实现,bind对应的系统调用是sys_bind:
Java代码
asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
{
struct socket *sock;
struct sockaddr_storage address;
int err, fput_needed;
///通过fd查找相应的socket,如果不存在则返回错误.
sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (sock) {
///用户空间和内核的地址拷贝.
err = move_addr_to_kernel(umyaddr, addrlen, (struct sockaddr *)&address);
if (err >= 0) {
err = security_socket_bind(sock,
(struct sockaddr *)&address,
addrlen);
if (!err)
///调用inet_bind方法.
err = sock->ops->bind(sock,
(struct sockaddr *)
&address, addrlen);
}
///将socket对应的file结构的引用计数.
fput_light(sock->file, fput_needed);
}
return err;
}
Tags:tcp connection setup
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接