TCP/IP学习(27)——协议初始化与简要的接收/发送流程

简介:

原文地址:TCP/IP学习(27)——协议初始化与简要的接收/发送流程 作者:GFree_Wind

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
    

从今天开始的源码学习,就不再拘泥于一行语句的具体含义,而是将注意力主要集中在整体流程和框架上。

TCP/IP协议的初始化函数为inet_inet,由fs_initcall(inet_init); 在系统启动时,自动调用。

  1. static int __init inet_init(void)
  2. {
  3.     struct sk_buff *dummy_skb;
  4.     struct inet_protosw *q;
  5.     struct list_head *r;
  6.     int rc = -EINVAL;

  7.     BUILD_BUG_ON(sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb));
     /* 申请reserved ports的bitmap */
  1.     sysctl_local_reserved_ports = kzalloc(65536 / 8, GFP_KERNEL);
  2.     if (!sysctl_local_reserved_ports)
  3.         goto out;
     /*
     注册TCP,UDP和RAW协议 
     */
  1.     rc = proto_register(&tcp_prot, 1);
  2.     if (rc)
  3.         goto out_free_reserved_ports;

  4.     rc = proto_register(&udp_prot, 1);
  5.     if (rc)
  6.         goto out_unregister_tcp_proto;

  7.     rc = proto_register(&raw_prot, 1);
  8.     if (rc)
  9.         goto out_unregister_udp_proto;

  10.     /*
  11.      *    Tell SOCKET that we are alive...
  12.      */
     /* 注册Inet familiy*/
  1.     (void)sock_register(&inet_family_ops);

  2. #ifdef CONFIG_SYSCTL
  3.     ip_static_sysctl_init();
  4. #endif

  5.     /*
  6.      *    Add all the base protocols.
  7.      */
     /*
     添加协议:ICMP,UDP,TCP和IGMP。
     从这里就可以看出,内核中支持的TCP/IP协议种类
     */
  1.     if (inet_add_protocol(&icmp_protocol, IPPROTO_ICMP) < 0)
  2.         printk(KERN_CRIT "inet_init: Cannot add ICMP protocol\n");
  3.     if (inet_add_protocol(&udp_protocol, IPPROTO_UDP) < 0)
  4.         printk(KERN_CRIT "inet_init: Cannot add UDP protocol\n");
  5.     if (inet_add_protocol(&tcp_protocol, IPPROTO_TCP) < 0)
  6.         printk(KERN_CRIT "inet_init: Cannot add TCP protocol\n");
  7. #ifdef CONFIG_IP_MULTICAST
  8.     if (inet_add_protocol(&igmp_protocol, IPPROTO_IGMP) < 0)
  9.         printk(KERN_CRIT "inet_init: Cannot add IGMP protocol\n");
  10. #endif

  11.     /* Register the socket-side information for inet_create. */
  12.     /* 初始化inetsw */
  13.     for (r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r)
  14.         INIT_LIST_HEAD(r);
     /* 
     将inetsw_array中的协议挂载到inetsw上 
     */
  1.     for (q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q)
  2.         inet_register_protosw(q);

     /*
     下面是各个Inet模块的初始化。
     */
  1.     /*
  2.      *    Set the ARP module up
  3.      */

  4.     arp_init();

  5.     /*
  6.      *    Set the IP module up
  7.      */

  8.     ip_init();

  9.     tcp_v4_init();

  10.     /* Setup TCP slab cache for open requests. */
  11.     tcp_init();

  12.     /* Setup UDP memory threshold */
  13.     udp_init();

  14.     /* Add UDP-Lite (RFC 3828) */
  15.     udplite4_register();

  16.     /*
  17.      *    Set the ICMP layer up
  18.      */

  19.     if (icmp_init() < 0)
  20.         panic("Failed to create the ICMP control socket.\n");

  21.     /*
  22.      *    Initialise the multicast router
  23.      */
  24. #if defined(CONFIG_IP_MROUTE)
  25.     if (ip_mr_init())
  26.         printk(KERN_CRIT "inet_init: Cannot init ipv4 mroute\n");
  27. #endif
  28.     /*
  29.      *    Initialise per-cpu ipv4 mibs
  30.      */

  31.     if (init_ipv4_mibs())
  32.         printk(KERN_CRIT "inet_init: Cannot init ipv4 mibs\n");

  33.     ipv4_proc_init();

  34.     ipfrag_init();
     
     /*
     这个将IP协议注册L2层
     */
  1.     dev_add_pack(&ip_packet_type);

  2.     rc = 0;
  3. out:
  4.     return rc;
  5. out_unregister_udp_proto:
  6.     proto_unregister(&udp_prot);
  7. out_unregister_tcp_proto:
  8.     proto_unregister(&tcp_prot);
  9. out_free_reserved_ports:
  10.     kfree(sysctl_local_reserved_ports);
  11.     goto out;
  12. }
这个初始化函数比较简单,但是已经为我们揭开了TCP/IP架构的面纱的一角。
下面具体说说关键的地方。
  1. proto_register:这个操作主要是为了将注册协议,挂载到/proc文件系统上。通过/proc/net/protocols可以看到注册协议的统计信息;
  2. sock_register;这个操作是注册socket family。也就是socket(2)中的第一个参数所指的family;这样通过family就可以调用对应family的回调函数;
  3. inet_register_protosw:这个操作从名字上看是注册proto,其实我个人觉得实际上是根据socket type注册。这个type也是对应于socket(2)中第二个参数socket_type。这个注册支持重复type,但是如果以前已经存在permanet的type且新的proto与原有的proto协议相同,就会报告冲突。
  4. dev_add_pack(&ip_packet_type):这个操作是将IP协议注册到2层(ptype_base)当中。当2层协议与ip_packet_type.type(cpu_to_be16(ETH_P_IP))相等时,即收到的2层包的payload为IP协议,即调用ip_packet_type对应的回调函数。
当inet_init执行完时,基本的TCP/IP协议已经挂载完毕。

对于发送流程来说,通过socket(2)建立socket,先通过socket family找到family,也就是inet_family_ops,然后调用create,然后根据socket_type以及proto从inetsw的数组中,找到正确的inetsw,然后将其对应的operation,proto 信息,以及其它信息赋给了socket。那么以后的操作,就可以使用socket中的operation或者proto进行处理了。

对于接受流程来说,首先netif_receive_skb——2层的入口之一为例,当2层type等于ip_packet_type.type时,会调用ip_packet_type的回调函数func,也就是ip_rcv。接收再往后的流程需要再细看看,今天就到这里了。

下次将重点学习数据包的接收流程。
相关文章
|
6月前
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
117 4
|
缓存 网络协议 Linux
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
|
XML 存储 JSON
【面试题精讲】序列化协议对应于 TCP/IP 4 层模型的哪一层?
【面试题精讲】序列化协议对应于 TCP/IP 4 层模型的哪一层?
|
10天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
44 3
|
21天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
49 13
|
21天前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
1月前
|
网络协议 算法 数据格式
【TCP/IP】UDP协议数据格式和报文格式
【TCP/IP】UDP协议数据格式和报文格式
129 3
|
1月前
|
XML JSON 网络协议
【TCP/IP】自定义应用层协议,常见端口号
【TCP/IP】自定义应用层协议,常见端口号
28 3
|
2月前
|
网络协议 网络架构 数据格式
TCP/IP基础:工作原理、协议栈与网络层
TCP/IP(传输控制协议/互联网协议)是互联网通信的基础协议,支持数据传输和网络连接。本文详细阐述了其工作原理、协议栈构成及网络层功能。TCP/IP采用客户端/服务器模型,通过四个层次——应用层、传输层、网络层和数据链路层,确保数据可靠传输。网络层负责IP寻址、路由选择、分片重组及数据包传输,是TCP/IP的核心部分。理解TCP/IP有助于深入掌握互联网底层机制。
441 2
|
4月前
|
网络协议 程序员 定位技术
学习网络的第一步:全面解析OSI与TCP/IP模型
**网络基础知识概览:** 探索网络通信的关键模型——OSI七层模型和TCP/IP五层模型。OSI模型(物理、数据链路、网络、传输、会话、表示、应用层)提供理论框架,而TCP/IP模型(物理、数据链路、网络、传输、应用层)更为实际,合并了会话、表示和应用层。两者帮助理解数据在网络中的传输过程,为网络设计和管理提供理论支持。了解这些模型,如同在复杂的网络世界中持有了地图。
101 2