加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[十六]:TCP三次握手

发布时间:2016-09-28 12:48:07 所属栏目:Linux 来源:站长网
导读:副标题#e# 内核:2.6.34 TCP是应用最广泛的传输层协议,其提供了面向连接的、可靠的字节流服务,但 也正是因为这些特性,使得TCP较之UDP异常复杂,还是分两部分[创建与使用]来进行分析。这篇主要包括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,     
};

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读