二:用电信号传输TCP/IP数据-2.1-创建套接字

本章把第一章里委托协议栈发送消息的内容展开来讲。

一、协议栈的内部

先看下“委托协议栈”这件事的整体结构:

大概的规则是,上面给下面委派工作,下面负责执行。具体分析当然有的上下关系不明确,有的甚至反过来,需要全部学完才能了解。

从上到下看一遍:
1)最上面是应用程序,这里可以泛指所有需要使用网络的应用程序,而不局限于浏览器。
因为不管应用程序收发的是什么东西,收发数据的原理是共通的。

2)下面是Socket库,DNS解析器也是其中一个组件。第一章里讲过,这个库就是个中间人,接受应用程序的委托,再通过协议栈执行。

3)再下面就是协议栈了。
协议栈上半部分有两块,分别是负责用TCP收发数据的部分和负责用UDP协议收发数据的部分。
浏览器等一般应用程序使用TCP协议,DNS解析这种较短的查询用UDP。
下面一半是用IP控制网络包收发的部分。
发送数据时,数据会被分成一个一个的网络包,将网络包发送给通信对象的操作就是IP来负责的。
此外,还有ARP和ICMP。
在这里我觉得这张图可能有点问题,因为从图中的分隔来看,把Socket库从操作系统中划出去了,第一章里明确讲过“操作系统的Socket库”。
这张图的表达很容易让人误以为Socket库属于应用程序。
2023年4月15日更新:这张图表达的是委托协议栈“这件事”的结构(事件流程),而不是应用程序、操作系统等内部的结构,因此没有问题。

4)最后,驱动程序控制网卡,网卡负责完成数据的收发操作。

二、创建套接字

2.1 套接字的实体

套接字只是一个概念,并没有什么实体。
既没有网卡这样的物理实体,也没有Socket组件那样的代码实体。
如果非要给套接字赋予一个实体,那么就是协议栈内部的通信控制信息,再具体一点就是存放这些信息的内存空间。
通信控制信息包括通信对象的IP地址、端口号、通信操作的状态等。
协议栈在执行操作时要参阅这些通信控制信息,比如要发送数据了,就要看一下对方的IP地址和端口号。
协议栈就是根据这些通信控制信息来工作的,也可以说,协议栈是根据套接字来工作的

直观地看下套接字的内容:

2.2 调用socket时发生了什么

上面讲了,浏览器收发数据是通过TCP,因此后面的内容都是关于TCP的。

第一步就是创建套接字。
应用程序调用socket申请创建套接字,协议栈分配内存空间(操作系统内存管理实际执行)给套接字,再向里面写入表示通信状态的信息(尚未开始通信),然后把描述符返回给应用程序。
是不是很像编程时创建变量并初始化的过程?
描述符就是套接字这个变量的名称,协议栈后面就通过描述符找到套接字从而实现通信控制。

posted @ 2023-02-27 11:42  GPL-技术沉思录  阅读(23)  评论(0编辑  收藏  举报