分类: 系统运维
2011-06-30 00:49:57
转载自:http://hi.baidu.com/amy_yeni/blog/item/ec0ec6d80852f7e138012f6b.html
网络连接
4.1 连接的建立和关闭
3)inet_create: 初始化sock的状态设置为SS_UNCONNECTED,申请一个新的sock结构,并且初始化socket的成员ops初始化为 inet_stream_ops,而sock的成员prot初始化为tcp_prot。然后调用sock_init_data,将该socket结构的变 量sock和sock类型的变量关联起来。
4)在系统初始化完毕后便是进行connect的工作,系统调用connect将一个和socket结构关联的文件描述符和一个sockaddr{}结构 的地址对应的远程机器相关联,并且调用各个协议自己对应的connect连接函数。对应于tcp类型,则 sock->ops->connect便为inet_stream_connect。
5)inet_stream_connect: 得到sk,sk=sock->sk,锁定sk,对自动获取sk的端口号存放在sk->num中,并且用htons()函数转换存放在sk-& gt;sport中。然后调用sk->prot->connect()函数指针,对tcp协议来说就是tcp_v4_connect()函 数。然后将sock->state状态字设置为SS_CONNECTING,等待后面一系列的处理完成之后,就将状态改成 SS_CONNECTTED。
6) tcp_v4_connect():调用函数ip_route_connect(),寻找合适的路由存放在rt中。ip_route_connect找两 次,第一次找到下一跳的ip地址,在路由缓存或fib中找到,然后第二次找到下一跳的具体邻居,到neigh_table中找到。然后申请出tcp头的空 间存放在buff中。将sk中相关地址数据做一些针对路由的变动,并且初始化一个tcp连接的序列号,调用函数tcp_connect(),初始化tcp 头,并设置tcp处理需要的定时器。一次connect()建立的过程就结束了。
连接的关闭主要如下:
1)close: 一个socket文件描述符对应的file{}结构中,有一个file_operations{}结构的成员f_ops,它的初始化关闭函数为sock_close函数。
2)sock_close:调用函数sock_release(),参数为一个socket{}结构的指针。
3)sock_release:调用inet_release,并释放socket的指针和文件空间
4)inet_release: 调用和该socket对应协议的关闭函数inet_release,如果是tcp协议,那么调用的是tcp_close;最后释放sk。