linux-Tcp IP协议栈源码阅读笔记(8)

来源:未知 责任编辑:责任编辑 发表时间:2015-10-08 14:16 点击:

 

       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->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。

 

        4.2 数据发送流程图

 

 

 

各层主要函数以及位置功能说明:

        1)sock_write:初始化msghdr{}结构net/socket.c

        2)sock_sendmsg:net/socket.c

        3)inet_sendmsg:net/ipv4/af_net.c

        4)tcp_sendmsg:申请sk_buff{}结构的空间,把msghdr{}结构中的数据填入sk_buff空间。net/ipv4/tcp.c

        5)tcp_send_skb:net/ipv4/tcp_output.c

        6)tcp_transmit_skb:net/ipv4/tcp_output.c

        7)ip_queue_xmit:net/ipv4/ip_output.c

        8)ip_queue_xmit2:net/ipv4/ip_output.c

        9)ip_output:net/ipv4/ip_output.c

        10)ip_finish_output:net/ipv4/ip_output.c

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • /etc/fstab 详解
  •  LVS-NAT和LVS-DR模式的实现详解
  •  RHCE考试之磁盘配额
  • nginx主主集群
  •  LVM逻辑卷管理器
  • 学习笔记:ACL详解
  • suse linux双网卡双网关配置
  • puppet文件服务配置
  •  Nginx主主负载均衡架构

快速直达

操作系统导航

LinuxWindows虚拟机
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1