Linux内核分析 - 网络[十六]:TCP三次握手
副标题[/!--empirenews.page--]
内核:2.6.34 TCP是应用最广泛的传输层协议,其提供了面向连接的、可靠的字节流服务,但 也正是因为这些特性,使得TCP较之UDP异常复杂,还是分两部分[创建与使用]来进行分析。这篇主要包括TCP的创建及三次握手 的过程。 编程时一般用如下语句创建TCP Socket: socket(AF_INET, SOCK_DGRAM, IPPROTO_TCP) 由此开始分析,调用接口[net/socket.c]: SYSCALL_DEFINE3(socket) 其中执行两步关键操作:sock_create()与sock_map_fd() retval = sock_create(family, type, protocol, &sock); if (retval < 0) goto out; retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK)); if (retval < 0) goto out_release; sock_create()用于创建socket,sock_map_fd()将之映射到文件描述符,使socket能通过 fd进行访问,着重分析sock_create()的创建过程。 sock_create() -> __sock_create() 从__sock_create()代码看到创建包含两步:sock_alloc()和pf->create()。sock_alloc()分配了 sock内存空间并初始化inode;pf->create()初始化了sk。 sock = sock_alloc(); sock->type = type; …… pf = rcu_dereference(net_families[family]); …… pf->create(net, sock, protocol, kern); sock_alloc() 分配空间,通过 new_inode()分配了节点(包括socket),然后通过SOCKET_I宏获得sock,实际上inode和sock是在new_inode()中一起分配的,结 构体叫作sock_alloc。 inode = new_inode(sock_mnt->mnt_sb); sock = SOCKET_I(inode); 设置inode的参数,并返回sock。 inode- >i_mode = S_IFSOCK | S_IRWXUGO; inode->i_uid = current_fsuid(); inode->i_gid = current_fsgid(); return sock; 继续往下看具体的创建过程:new_inode(),在分配后,会设置i_ino和i_state的值。 struct inode *new_inode(struct super_block *sb) { …… inode = alloc_inode(sb); if (inode) { spin_lock(&inode_lock); __inode_add_to_lists(sb, NULL, inode); inode->i_ino = ++last_ino; inode->i_state = 0; spin_unlock(&inode_lock); } return inode; } 其中的alloc_inode() -> sb->s_op->alloc_inode(),sb是sock_mnt->mnt_sb,所以alloc_inode()指 向的是sockfs的操作函数sock_alloc_inode。 static const struct super_operations sockfs_ops = { .alloc_inode = sock_alloc_inode, .destroy_inode =sock_destroy_inode, .statfs = simple_statfs, }; (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |