二:用电信号传输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申请创建套接字,协议栈分配内存空间(操作系统内存管理实际执行)给套接字,再向里面写入表示通信状态的信息(尚未开始通信),然后把描述符返回给应用程序。
是不是很像编程时创建变量并初始化的过程?
描述符就是套接字这个变量的名称,协议栈后面就通过描述符找到套接字从而实现通信控制。
本文来自博客园,作者:GPL-技术沉思录,转载请注明原文链接:https://www.cnblogs.com/polin/p/17159148.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人