(该图由AI制作 学习AI绘图 联系我)
目录
协议栈的内部结构
套接字的实体就是通信控制信息
真正的套接字
调用 socket 时的操作
从应用程序收到委托后
,
协议栈通过
TCP
协议收发数据的操作可以分为
4
个阶段
。
首先是创
建套接字
,
在这个阶段
,
我们将介绍协
议栈的内部结构、套接字的实体,以及创建套接字
的操作过程
。
到这
里
,
大家应该可以对套接字到底是什么样的一个东西有一个比较具体
的理解
。
协议栈的内部结构
图中最上面的部分是网络应用程序
浏览器、电子邮件客户端、Web 服务器、电子邮件服务器等程序
应用程序的下面是
Socket 库,其中包括解析器
,
解析器用来向
DNS服务器发出查询
再下面就是
操作系统内部
了
,
其中包括协议栈
协议栈的
上半部分
有两块
,
分别是负责用
TCP
协议收发数据的部分和负责用
UDP
协议收发数
据的部分
浏览器、邮件等一般应用程序收发数据时用 TCP;DNS 查询等收发较短的控制数据时用 UDP
下面一半
是用
IP
协议控制网络包收发操作的部分
IP
中还包括
ICMP
A
协议和
ARP
B
协议。
ICMP
用于告知网络包传送过程中产生的错误以及各种控制消息
,
ARP
用于根据
IP
地址查询相应的以太网
MAC
地址
IP
下面的网卡驱动程序负责控制网卡硬件
,
而最下面的网卡则负责完成实际的收发操作
,
也就是对网线中的信号执行发送和接收的操作
套接字的实体就是通信控制信息
在协议栈内部有一块用于存放控制信息的内存空间
,
这里记录了用于
控制通信操作的控制信息
例如通信对象的
IP
地址
、
端口号
、
通信操作的进行状态等
本来套接字就只是一个概念而已
,
并不存在实体
,
如果一定要赋予它一个实体
,
我们可以说这些控制信息就是套接字的实体
,
或者说
存放控制信息的内存空间就是套接字的实体
协议栈在执行操作时需要参阅这些控制信息
协议栈是根据套接字中记录的控制信息来工作的
真正的套接字
图中每一行相当于一个套接字,当创建套接字时,就会在这里增加一行新的控制信息
举个例子:
比如第
8
行
,
它表示
PID
B
为
4
的程序正在使用
IP
地址为
10.10.1.16
的网卡与
IP
地址为10.10.1.18
的对象进行通信
。
此外我们还可以看出
,
本机使用
1031
端口
,
对方使用
139
端口
,
而
139
端口是
Windows
文件服务器使用的端口
因此
我们就能够看出这个套接字是连接到一台文件服务器的
。
我们再来看第
1
行
,
这一行表示
PID
为
984
的程序正在
135
端口等待另一方的连接
,
其中
本地
IP
地址和远程
IP
地址都是
0.0.0.0
,
这表示通信还没开始
,
IP
地址不
确定
调用 socket 时的操作
浏览器调用
socket
、
connect
等
Socket
库中的程序组件时
,
协议栈内部是如何工作的
浏览器委托协议栈使用 TCP 协议来收发数据
创建套接字的阶段如图 ①所示
应用程序调用
socket
申请创建套接字
,
协议栈根据应用程序的申请执行创建套接字的操作
创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态。
将表示这个套接字的描述符告知应用程序(描述符相当于用来区分协议栈中的多个套接字的号码牌)
收到描述符之后
,
应用程序在向协议栈进行收发数据委托时就需要提供这个描述符