网络是怎样连接的--探索协议栈和网卡

news2024/11/27 1:37:05

“如果一生只有一次翻身的机会,那就用尽全力吧。”

文章目录

    • 1.创建套接字
        • 1.1 协议栈的内部结构
        • 1.2 套接字的实体就是通信控制信息
        • 1.3 调用socket时的操作
    • 2.连接服务器
        • 2.1连接含义
        • 2.2 负责保存控制信息的头部
        • 2.3 连接操作的实际过程
    • 3.收发数据
        • 3.1将http请求消息交给协议栈
        • 3.2对较大的数据进行拆分
        • 3.3 使用ack号确认网络包已收到
        • 3.4调整ack号等待时间
        • 3.5 使用窗口有效管理ack号
        • 3.6接收HTTP响应消息
    • 4.与服务器断开连接并删除套接字
        • 4.1数据发送完毕后断开连接
        • 4.2删除套接字
        • 4.3收发小结
    • 5.IP与以太网的包的收发操作
        • 5.1包的基本知识
        • 5.2包的收发操作概览
        • 5.3生成包含接收方IP地址的头部
        • 5.4生成以太网用的mac头部
        • 5.5 通过arp查询路由器的mac地址
        • 5.6以太网的基本知识
        • 5.7将IP包转换成电或者光信号发送出去
        • 5.8给网络包加三个控制数据
        • 5.9向集线器发送网络包
        • 5.10接收返回包
        • 5.11将服务器的响应包从IP传递给TCP

1.创建套接字

1.1 协议栈的内部结构

在这里插入图片描述

  操作系统内部包括协议栈,是哪个半部分分为TCP和UDP,这俩区别就是浏览器、邮件等一般应用收发数据用TCP;DNS查询这种比较短的数据用UDP。
  下面就是IP模块,IP协议控制网络包收发,在互联网发送数据时,数据会被切割成一小块网络包的形式,然后由IP模块发送给通信对象。
  IP模块中的ICMP和ARP协议,ICMP用于告知网络包传输过程中发生的错误及各种控制信息;ARP根据IP地址查询以太网mac地址。


1.2 套接字的实体就是通信控制信息

  协议栈内部有一块存放控制信息的内存空间,记录了例如通信对象的IP,端口号,进行状态等控制通信操作的控制信息。套接字其实就是一个概念,也可以说这些控制信息就是套接字的实体。 协议栈在执行通信相关的操作时,都需要查看这些信息。协议栈是根据套接字中记录的控制信息来工作的。


1.3 调用socket时的操作

在这里插入图片描述

  应用程序根据调用socket请求创建套接字,然后协议栈根据应用程序的申请来执行相关的操作。
  具体过程:协议栈首先分配一个存放套接字的内存空间,记录控制信息用的,没有进行操作的时候内存空间就写如初始状态的控制信息。接下来协议栈生成一个描述符返回给应用程序。收到描述符后,应用程序就只需要跟协议栈提这个描述符就可以了,通过描述符确定套接字。


2.连接服务器

2.1连接含义

  创建完套接字之后,应用程序会调用socket库中的connect,然后协议栈就会将本地的套接字和服务器的套接字连接上。(1)套接字刚创建的时候,里面还没有相关的信息,因此需要将服务器的IP地址和端口号告诉协议栈;(2)客户端这边的信息处理好了,现在需要知道服务器的套接字信息,服务器一般在系统启动的时候就创建好了套接字等待客户端连接。但是与客户端不同的是,服务器不知道和谁通信。所以客户端需要给服务器发送通信的请求,同时交换控制信息(这就叫连接)。

  在数据收发的时候,也需要一块内存空间(缓冲区),用于临时存放数据。


2.2 负责保存控制信息的头部

  上面说的交换控制信息,整个通信过程都会需要,包括数据收发,断开等,这些内容在TCP协议的格式中有定义,这些信息会被添加在客户端与服务器通信发送网络包的头部,以太网和IP协议都有自己的控制信息,都是分开的。
在这里插入图片描述

  控制信息还有另外一类:保存在套接字中用来控制协议栈的信息:包括应用程序传递过来的信息以及通信对象传递过来的信息和收发数据的执行信息。套接字的控制信息和协议栈程序本身是一体的。


2.3 连接操作的实际过程

  连接操作是应用程序调用socket库中的connect开始的,connect(<描述符>,<服务器IP地址和端口号>,…)。括号中的信息会传递给TCP模块,TCP模块会与服务器的TCP模块交换控制信息。具体过程如下:

  • 首先,客户端创建数据收发操作控制信息的头部(注意发送方和接收方的端口号)
  • 将头部中的SYN比特设置为1,表示连接。还有合适的序列号和窗口号

  TCP头部创建好后,TCP模块会将信息传递给IP模块(执行发送),执行发送操作之后,服务器会接收到网络包,服务器上的IP模块会将数据传递给TCP模块,然后TCP模块根据TCP的头部信息找到端口号对应的套接字,然后将套接字的状态写成正在连接,然后服务器会返回响应消息,过程和客户端一样,需要在TCP头部设置发送方和接收方的端口号和SYN比特,在返回响应消息时将ack控制位设置为1,表示已经接收到网络包。
  连接成功之后客户端会在套接字中写入服务器的IP和端口号等信息,状态改成连接完毕。最终呢客户端还需要将ack设置为1返回到服务器,表示响应包已经接收到了。


3.收发数据

3.1将http请求消息交给协议栈

  连接完成之后就是进行数据收发的操作,数据收发操作首先也是应用程序调用write将要发送的数据交给协议栈(放入发送缓冲区 ,等下一段数据)。协议栈不关心内容,应用程序会在调用write的时候告诉长度。协议栈内部有一计时器,即使到一定时间之后,缓冲区数据长度不够,也会将数据发出去。


3.2对较大的数据进行拆分

在这里插入图片描述


3.3 使用ack号确认网络包已收到

  网络包发送给服务器,TCP需要确定对方是否收到网络包,没收到会重发。接受方会将目前接收到的数据长度加起来,写入TCP头部的ack号(比特设置为1)中发送给发送方。
在这里插入图片描述
  图中序号的初始值并不一定是1,而是一个随机数·。在设置SYN的时候就会设置序号的初始值。服务器收到序号和数据之后会返回给客户端ack号。服务器发送返回消息也是这个操作。
在这里插入图片描述
  如果没有返回某些包对应的ack号那么就会重新发送这些包。但是呢,遇到服务器宕机和网络中断的时候,TCP会尝试几次传递之后就会放弃,并向应用程序报错。


3.4调整ack号等待时间

  根据网络包的平均往返时间调整ack号等待时间,也就是说因为网络繁忙的情况导致ack号返回很慢,这种情况应该先不重传数据。等待时间需要动态调整(TCP),TCP会在发送数据的时候持续测量ack号的返回时间。


3.5 使用窗口有效管理ack号

  在等待ack号的过程不做什么就有点浪费资源了,所以在等待ack号的过程中可以持续的传递数据。
在这里插入图片描述

但是像这种传递方式可能会导致接收缓冲区溢出,所以呢,接收方就需要将自己最多能接收多少数据告诉发送方。接受方会通过TCP窗口将自己能接受的最大数据量(窗口大小)告诉发送方。

在这里插入图片描述

ack号和窗口合并

  如果在等待发送ack号的时候正好需要更新窗口,那么更新窗口和ack号就可以放进入一个包。还有就是因为ack号表示已经接收到的数据量,如果碰着连续发送ack号的,那么就发送最后一个ack号就可以了。窗口更新也是如此。


3.6接收HTTP响应消息

  接收HTTP响应消息,浏览器会调用read来读取响应消息,控制流程转入协议栈,接收消息也是放入内存缓冲区,然后浏览器读取数据,协议栈会将原始数据还原出来复制到应用程序的内存地址,然后控制流程转移到应用程序。协议栈还需要找合适的时机向服务器发送窗口更新。


4.与服务器断开连接并删除套接字

4.1数据发送完毕后断开连接

  以服务器发起断开为例:服务器会调用close,然后服务器协议栈生成包含断开信息的TCP头部,也就是将FIN比特设为1。然后协议栈委托IP模块发出去。当客户端收到信息之后,会将自己的套接字进入断开操作,客户端会返回一个ack号以告知服务器我已经收到信息。然后应用程序就调用read来读数据。然后告诉应用程序来自服务器的信息都收到了,然后客户端调用close结束收发操作,现在客户端也会生成一个FIN比特设为1的TCP头部的包,委托IP模块发出去,然后服务器再返回一个ack号,就结束了。
在这里插入图片描述


4.2删除套接字

删除套接字操作一般会等待几分钟,因为假如套接字立刻删除了,而客户端返回的ack号丢失了,那么重新发送的ack号就可能进入新的同端口号的套接字,然后新套接字就开始执行断开操作。所以需要等几分钟再删除套接字。


4.3收发小结

在这里插入图片描述


5.IP与以太网的包的收发操作

5.1包的基本知识

  包一般分为头部和数据,头部一般包含控制信息,地址等,可以理解为快递的面单,后面就是数据。
在这里插入图片描述
  生成包后也就是得进行发送和转发包的操作,包会首先发往被最近的网络转发设备,然后转发设备根据头部信息判断接下来会发往哪儿,转发设备里面会有一张表,记录每一个地址对应的发送方向。发送方和接受方是终端节点,网络转发设备是中间节点。

路由器和集线器两种转发设备的分工

  1. 路由器根据目标地址判断下一个路由器的位置
  2. 集线器在子网中将网络包传给下一个路由

集线器是按照以太网规则来的,路由器是按照IP规制

  1. IP协议根据目标地址判断下一个IP转发设备
  2. 子网中的以太网协议将包传递给下一个转发设备

  TCP/IP包有以太网头部和IP头部,服务器的IP地址在IP头部,IP协议会委托以太网委托以太网协议将包发送出去,IP协议会去找下一个路由器的以太网地址,并将这个地址写入mac头部,集线器里面有以太网表,根据以太网头部信息查询出对应的传输方向。
在这里插入图片描述


5.2包的收发操作概览

在这里插入图片描述

  实际上包的发送传输工作都是由集线器和路由器来整的,IP模块就是一入口。TCP模块指定通信对象的IP地址,IP模块收到TCP的委托之后,会将整块包当作一个数据,并且添加IP头部和mac头部,IP头部包含IP协议规定的和根据IP地址发送到目的地的控制信息。mac头部包含通过以太网的局域网将包传递给最近的路由器所需的控制信息。
  封装好的包会传递给网卡,网卡会将这些信息转换成电信号和光信号,并通过网线or光纤进行传输,然后这些信号就会到达集线器和路由器这些位置,到到达后,接收方也会做出响应,接受过程和发送过程是相反的,网卡会将其转换成数字信息之后再传给IP模块,然后IP会将TCP块传递给TCP模块。


5.3生成包含接收方IP地址的头部

在这里插入图片描述

  TCP模块会将接收方的IP告诉IP模块,这个地址来自应用程序,IP模块还包含发送方的IP,这个IP并不是分配给计算机的,如果计算机上有多个网卡,那么就会有多个IP地址,发送方IP需要通过判断发送方使用的网卡来判断具体的IP地址。先确定目标路由器就能确定具体网卡,也就是确定也发送方的IP。


5.4生成以太网用的mac头部

在这里插入图片描述

  发送方的mac地址是生产网卡时写入rom里面的,需要的时候直接读取就欧克,如果多块网卡的情况就先判断使用了那儿块网卡,然后再读取。对方的以太网地址根据IP地址查询mac地址。


5.5 通过arp查询路由器的mac地址

  上面说到根据IP地址查询mac地址的操作,具体如何查询呢,这时就需要ARP(地址解析协议),也就是利用广播向所有的设备提问。
在这里插入图片描述
为了增加查询效率,也设置了ARP缓存,查询过就会有记录。过一段时间也会删除。
在这里插入图片描述


5.6以太网的基本知识

在这里插入图片描述

  现在以太网采用的是交换式集线器的结构,现在信号只会流到mac地址指定的设备,以太网最基本的性质如下

  • 将包发送到mac头部对应的接收方的mac地址
  • 用发送方的mac识别发送方
  • 用以太类型识别包的内容

5.7将IP包转换成电或者光信号发送出去

  讲完了IP模块的内容,接下来就是网卡的作用,IP生成的网络包只是存在内存的遗传数字,没办法发送出去,所以需要将数字信息转换成光信号or电信号,这就是网卡的作用。但是网卡不能单独工作,得需要驱动程序,大部分得硬件设备都需要驱动程序。网卡并不是一通电就能用,还需要初始化,由网卡驱动程序进行。
在这里插入图片描述
网卡中保存的mac地址由网卡驱动程序读取并分配给mac头部。


5.8给网络包加三个控制数据

  网卡驱动从IP获取包后,将其复制到网卡的缓冲区,然后向模块发送发送包的命令。mac将包从缓冲区取出来,加上报头和起始帧,在末尾加上检测错误的FCS(帧校验序列)。
在这里插入图片描述
在这里插入图片描述


5.9向集线器发送网络包

  给网络包加上上个数据之后,就可以将网络包发送出去了有两种发送方式:1是使用集线器的半双工模式,2是使用交换机的全双工模式。2在下一章。

半双工模式

  ①为了避免信号碰撞,首先需要判断网线中是否有其他设备发送的信号。
  ②然后mac模块就开始将数字信息按每个比特转换成电信号。
  ③然后由PHY或者MUA的信号收发模块发送出去。
  ④PHY模块会将信号转换成可在网线上传输的格式。

  注:将数字转换成电信号的速率就是网络的传输速率。

  以太网规格中对不同网线类型和速率以及其对应的信号进行了规定,但是mac不关心这些,随便搞个任意格式的发给PHY了,然后PHY再转换成网线上的传输形式。

  PHY模块还需要监控线路中有没有其他信号。这可能会发生阻塞信号,然后所有的发送操作都会停止,然后等待,这儿需要设置一等待时间,mac地址生成的随机数,但是网络拥塞的时候,还是容易碰撞。


5.10接收返回包

  接收操作和发送操作是相反的,首先PHY工作将电信号转换成通用格式发给mac,mac将电信号转换成数字信号,然后放入缓冲区,到达末尾的信号还需检查FCS。接下来网卡会通知计算机收到一个包,这时需要中断计算机的任务,让他关注网卡,有个机制叫做中断。
  中断:网卡向扩展总线的中断信号线发送信号,该信号线通过中断控制器连到CPU,这时会切换到中断处理程序。中断处理程序会调用网卡驱动,控制网卡执行相关操作。中断也是有编号的,网卡在安装的时候和硬件设置了中断号,中断处理程序将中断号和相应的驱动程序绑定。
  调用完中断处理程序之后,从缓冲区取出包,通过mac头部判断协议类型,通常是TCP/IP,然后交给TCP/IP协议栈。


5.11将服务器的响应包从IP传递给TCP

  传递到TCP/IP协议栈的时候,会先由IP模块来工作,先检查IP头部格式,如果不是自己的包,IP模块会通过ICMP消息叫错误告诉给发送方。

ICMP消息
在这里插入图片描述

当收到分片的包时,IP模块会将这些暂存在缓冲区,如果IP正确,当IP头部具有相同id的全到达之后,那么IP模块会把他们还原成原始的包,此外IP头部还有一个分片偏移量字段,表示分片在整个包的位置。—分片重组。
  最后就是TCP模块的工作了,TCP根据IP头部双方的IP地址,和TCP头部双方的端口号然后找到对应的套接字,根据套接字记录的通信状态,然后执行相关操作。–>如果包里是应用程序数据,返回确认的包,将数据放回缓冲区,等应用程序来取;


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript | 1000个判断条件难道要写了1000个 if ? 一文教你如何实现分支优化

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;大三学生&#xff0c;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&am…

K线形态识别_身怀六甲和十字胎

写在前面&#xff1a; 1. 本文中提到的“K线形态查看工具”的具体使用操作请查看该博文&#xff1b; 2. K线形体所处背景&#xff0c;诸如处在上升趋势、下降趋势、盘整等&#xff0c;背景内容在K线形态策略代码中没有体现&#xff1b; 3. 文中知识内容来自书籍《K线技术分析》…

双非本计算机从零开始三年努力能做到什么程度【学习路线回顾总结问答】

文章目录前言一、回顾大学1.1 大一上1.1.1 第一个学期1.1.2 第一个寒假1.2 大一下1.2.1 第二个学期1.2.2 第一个暑假1.3 大二上1.3.1 第三个学期1.3.2 第二个寒假1.4 大二下1.4.1 第四个学期1.4.2 第二个暑假1.5 大三上1.5.1 第五个学期1.5.2 第三个寒假1.6 大三下1.6.1 第六个…

3.1 机器学习 --- 决策树

3.1 机器学习 — 决策树 一 金融评分卡 模型做好后尽量快的上线&#xff0c;以符合要求的模型&#xff0c;尽快上线。超参数赋予权重&#xff0c;使得模型的参数不一致&#xff0c;而达到均衡样本数据 二 决策树原理 1. 找女朋友 性别&#xff1a;男 女年龄&#xff1a;20…

二叉树跟前缀、中缀、后缀表达式

目录 一.概念 二.跟二叉树的联系 前序遍历&#xff08;先根遍历&#xff09; 中序遍历&#xff08;中根遍历&#xff09; 后序遍历&#xff08;后根遍历&#xff09; 二叉树例题 三.知二求一并还原二叉树 已知前序遍历和中序遍历 例题 解答 已知中序遍历和后序遍历 …

【双十一特辑】爱心代码(程序员的浪漫)

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 目录 前言 C语言简易爱心代码 原理 代码 执行结果 C语言动态爱心代码 涉及知识点 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),字体色) sheep() 代码 执行结果 Python简易爱…

c++数据结构第六周(图),深搜、广搜(stl版)

本方法皆用vector进行邻接表模拟 7-1 图的先深搜索 作者 唐艳琴 单位 中国人民解放军陆军工程大学 输出无向图的给定起点的先深序列。 输入格式: 输入第一行给出三个正整数&#xff0c;分别表示无向图的节点数N&#xff08;1<N≤10&#xff09;、边数M&#xff08;≤50&a…

CentOS7.x部署GreenPlum6.x

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、GreenPlum是什么&#xff1f;二、使用步骤1.环境说明2.集群介绍3.修改主机名(root)4.网络映射(root)5.创建安装目录6.安装部署7.SSH (免密登录)8.环境配置9.…

【SOLIDWORKS学习笔记】制作小风扇摇头底座(下)--- 细节优化

介绍&#xff1a;俗话说的好&#xff0c;电控决定机器人下限&#xff0c;机械决定机器人上限。作为一个在电控领域摸打滚爬了三年的选手&#xff0c;一直非常心动那些酷炫的机械模型&#xff0c;但是一直以来只能做甲方给别人提需求&#xff0c;做不到自己动手实现。所以我打算…

ES6学习24~47

2.14 Promise 2.14.1 什么是Promise Promise是ES6引入的异步编程的新解决方案。语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。 Promise 构造函数: Promise (excutor) {}Promise.prototype.then 方法Promise.prototype.catch 方法 2.14.2 pr…

假脱机技术——实现独占设备变成共享设备

文章目录什么是脱机技术假脱机技术——SPOOLing输入井和输出井输入进程与输出进程输入输出缓冲区共享打印机原理分析—假脱机技术的一种应用什么是脱机技术 因为我们的手工操作阶段&#xff0c;主机之间从I/O设备获得数据&#xff0c;由于设备由人工操作&#xff0c;主机速度很…

Android Studio打造一个小说阅读App

应用目录一、基本信息二、功能介绍1. 主界面2. 排行榜界面3. 分类界面4. 搜索界面5. 书籍详情界面6. 阅读界面7. 相关书籍界面三、类图/时序图/架构图四、采用技术及原因1.ViewPagerFragment的使用2.RadioGroup实现导航栏3.Retrofit的网络加载框架4.设置同步变量控制线程顺序5.…

【测试沉思录】12. 可用性保障平台的自动化测试探索与实践

欢迎订阅我的新专栏《现代命令行工具指南》&#xff0c;精讲目前最流行的开源命令行工具&#xff0c;大大提升你的工作效率。 作者&#xff1a;张雅瑜 编辑&#xff1a;毕小烦 一. 背景 随着业务的发展&#xff0c;应用越来越多&#xff0c;并且承载的业务量越来越大&#xff…

推箱子游戏设计与实现(Java+swing+JAWT)

目 录 摘 要 i Abstract ii 引 言 1 1 系统分析 2 1.1 技术可行性分析 2 1.1.1 可行性目的 2 1.1.2 可行性研究前提 2 1.1.3 算法可行性分析 2 1.1.4 平台选择 6 1.2 需求分析 6 1.2.1 引言 6 1.2.2 游戏需求 6 1.2.3 软硬件需求 9 1.2.4 接口控制 10 1.3 方案论证 10 1.3.1 C语…

JCDY-2A DC220V【直流高低值电压继电器】

系列型号 JCDY-2A/220V直流高低值电压继电器&#xff1b;JCDY-2A/110V直流高低值电压继电器&#xff1b; JCDY-2A/48V直流高低值电压继电器&#xff1b;JCDY-2B/220V直流高低值电压继电器&#xff1b; JCDY-2B/110V直流高低值电压继电器&#xff1b;JCDY-2B/48V直流高低值电压继…

MongoDB工具命令和用户认证

1.MongoDB工具命令 文章目录1.MongoDB工具命令1.1.Mongod命令1.2.Mongos命令1.3.Mongostat命令1.4.Mongotop命令1.5.Mongooplog命令1.6.Mongoperf命令2.MongoDB用户认证2.1.创建一个用户2.2.修改配置文件启用用户认证2.3.重启MongoDB2.4.使用用户口令登录MongoDB3.授权用户并赋…

【数据结构】链表OJ第二篇 —— 链表的中间节点 链表中倒数第k个节点 链表分割 链表的回文结构 相交链表

文章目录0. 前言1. 链表的中间节点2. 链表中倒数第k个结点3. 链表分割4. 链表的回文结构5. 相交链表6. 结语0. 前言 书接上回&#xff0c;我们这次依然是为大家带来链表的OJ题。这一次的题量比之前多一些&#xff0c;内容为链表的中间节点、链表中倒数第k个节点、链表分割、链…

安卓讲课笔记5.2 编辑框

文章目录零、本讲学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;继承关系图&#xff08;二&#xff09;编辑框常用属性&#xff08;三&#xff09;教学案例&#xff1a;用户注册1、创建安卓应用2、准备图片素材3、主界面与主布局资源文件更名4、创建息界面类5、字…

数据获取与预处理

文章目录Requests简介Requests库安装Requests库的基本操作Requests库的7个主要方法Request方法get方法Response对象的属性head方法post方法Requests简介 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 首先他是个第三方库&#xff0c;应用非常广泛 采用Apac…

《数据结构》(六)八大排序(下)

承接上篇的八大排序&#xff0c;今天本篇文章主要讲归并排序&#xff0c;冒泡排序&#xff0c;快速排序(挖坑&#xff0c;左右指针&#xff0c;前指针)和计数排序 八大排序交换排序冒泡排序冒泡排序思想代码冒泡排序总结快速排序快速排序思想三数取中快速排序之挖坑法挖坑法代码…