网络子系统之网络层和socket

引用

  • Monitoring and Tuning the Linux Networking Stack: Receiving Data
  • Monitoring and Tuning the Linux Networking Stack: Sending Data
  • Linux的SOCKET编程详解
  • Linux内核 TCP/IP、Socket参数调优
  • 理解 Linux 网络栈(1):Linux 网络协议栈简单总结
  • Linux 网络栈剖析

 

一. Socket层  

1.1 基本数据结构

  Socket(套接字)是 网络应用程序与TCP/IP协议栈之间的接口。

作用:

  • 传输数据
  • 为TCP管理连接
  • 控制或调节TCP/IP协议栈

AF_XXX: address families

PF_XXX: Protocol families

网络子系统之网络层和socket_第1张图片

网络子系统之网络层和socket_第2张图片

   套接字API由两部分构成:

1. 由网络的功能组成(由struct prot数据结构描述)

2. 将网络的操作映射到linux常规I/O操作上,这样应用程序就可以如调用普通文件I/O一样使用TCP/IP来传递和接收数据(由struct proto_ops数据结构描述)

 

网络子系统之网络层和socket_第3张图片

  • proto_ops: 完成从与协议无关的套接字层到协议相关的传输层的对接。
  • prot: 完成从传输层到网络层的对接。

每个传输层的协议都需要定义一个特定的proto_ops结构实例和proto结构实例

在IPv4协议族中,一个传输层协议对应一个inet_protosw结构,inet_protosw结构中包含了proto_ops结构和proto结构。

协议族中所有的inet_protosw结构实例都定义在静态数组inetsw_array[]中,网络子系统初始化时,根据每个结构type成员,也就是socket类型,注册到一个全局的list_head结构数组inetsw[]中,即socket类型相同的inet_protosw结构在inetsw[]中以其对应的元素为链表头组成一个双向链表。

static int __init inet_init(void)  // net/ipv4/af_inet.c

  • 套接字层的操作函数注册

套接字与系统调用之间的接口 是由 inet_register_protosw() 注册到 inetsw_array[] 协议交换表中,由 inet_unregister_protosw() 从协议表中移除。

  • 协议实例的网络功能函数注册

协议实例的网络功能描述 struct proto 是由 proto_register() 注册到 inetsw_array[] 协议交换表中,由proto_unregister() 将其从 inetsw_array[]协议交换表中移除。e.g. proto_register(&tcp_prot, 1);

网络子系统之网络层和socket_第4张图片

 

1.2 套接字系统调用

网络子系统之网络层和socket_第5张图片

 

1.3 输入,输出数据结构

   套接字是一个通用接口,它可以与多个协议族接口,每个协议族中有可以实现多个协议实例。 TCP/IP协议栈处理完输入数据包后,将数据包交给套接字层,放在套接字的接收缓存区队列中(sk_rcv_queue),数据包从套接字层离开内核,送给应用层等待数据包的用户程序。用户程序向外发送的数据包缓存在套接字的传送缓冲区队列中(sk_write_queue),从套接字层进入内核地址空间。

   尽管通过发送系统调用 sendto(), send()发送数据时,可以直接指定待输出数据的地址;通过接收系统调用 recvfrom(), recv()接收时,直接指定数据的缓冲区,然而,最终还是需要组合成msghdr结构进行处理。因为msghdr结构能够描述更多更完整的信息,包括数据块,控制信息等。

网络子系统之网络层和socket_第6张图片

 

        struct sock 有三个队列(queue),分别是 rx , tx 和 err,在 sock 结构被初始化的时候,这些缓冲队列也被初始化完成;在收据收发过程中,每个 queue 中保存要发送或者接受的每个 packet 对应的 Linux 网络栈 sk_buffer 数据结构的实例 skb。

网络子系统之网络层和socket_第7张图片

1.4 输出系统调用

网络子系统之网络层和socket_第8张图片

 

1.5 输入系统调用

网络子系统之网络层和socket_第9张图片

 

1.6 socket和传输层关系

网络子系统之网络层和socket_第10张图片

 

1.7 TCP 函数调用关系

网络子系统之网络层和socket_第11张图片

1.8 UDP函数调用关系

网络子系统之网络层和socket_第12张图片

 

你可能感兴趣的:(linux系统开发,协议,linux,网络子系统)