《网络是怎样连接的》计网第二章:协议栈、网卡

在这里插入图片描述

二、协议栈和网卡

1.协议栈

  1. 应用程序:浏览器,Web服务器 +Socket库
  2. 操作系统:TCP(需要连接),UDP(不需要连接),IP(传送网络包)
  3. 驱动程序:网卡驱动程序
  4. 硬件:网卡

2.收发数据

1.过程概述

协议栈进行收发数据

  1. 创建套接字:调用创建套接字程序后,应用程序会将接收到的描述符(用来识别不同的套接字)放在内存中
  2. 将管道连接到服务器端的套接字上:connec函数将描述符(协议栈来选择使用哪一个套接字去进行连接),IP地址,端口号(通常都是提前被规定好的,80是web端口,25是邮箱端口)
  3. 收发数据:write和read方法
  4. 断开管道并删除套接字:规定要求服务器要先断开连接close,操作告知客户端后,客户端也断开,然后浏览器调用read时,会被告知收发结束,则浏览器也开始调用close,后来Http1.1中修改为所有数据请求完成后,浏览器主动触发断开操作
2.创建套接字

协议栈中存放控制信息的内存地址

套接字是一个概念,是控制信息的集合概念

  1. 客户端和服务器互相联络时交换的控制信息 头部(TCP头部、以太网头部、IP头部)

    ​ 在连接、数据收发、断开连接等所有通信过程都需要,被添加在传递的网络包的开头

    . 保存在套接字中,用来控制协议栈操作的信息

    ​ 应用程序传来的信息,通信对象接收到的信息,收发数据操作的执行状态会知道协议栈的工作

通信对象的IP地址、端口号、通信操作的进行状态

协议栈为套接字分配一个内存空间,然后向其中写入初始状态,并把描述符告知应用程序

3.连接服务器

客户端:浏览器可以通过解析网址获得服务器IP和端口号等,但是协议栈不知道,所以需要把服务器的相关信息告知协议栈

服务器端:创建了套接字,但是应用程序和协议栈都不知道通信的对象,所以需要客户端发出申请

连接实际上就是双方交换控制信息,在套接字中记录这些必要的信息并准备数据收发

  1. 客户端TCP模块创建一个包含表示开始数据收发操作的控制信息的头部,将头部控制位SYN设为1
  2. 客户端TCP委托IP模块进行包的发送
  3. 服务器通过包的头信息找到客户端想要使用的套接字,修改其状态为正在连接
  4. 服务器端TCP书写头部信息,以及SYN,设置ACK控制位为1(表示已收到网络包)
  5. 服务器端TCP委托IP模块进行包的发送
  6. 客户端读取头部信息检查SYN为1表示连接成功,找到套接字,修改状态位连接完成
  7. 客户端书写ACK为1并发往服务器来告知服务器刚刚的包已经收到
4.收发数据
  1. 应用程序调用write将要发送的数据交给协议栈
  2. 协议栈等待数据达到一定的条件,将数据发送(序号:头部包含数据的开始字节处,数据长度:通过整个包长度-头部长度)
    1. 网络最大包容纳数据长度MSS+头部长度=MTU网络包最大长度
    2. 等待时间
  3. 根据协同在数据发送的两个数据,接收方能够检查收到的网络包有没有遗漏,ACK:到多少字节之前的数据都被接收到
  4. 发送方获得ACK反馈,如果出现错误,则重新发送;数据包会一直在缓存中,直到正确
  5. 浏览器在委托协议栈发送请求之后,会调用read程序来去协议栈中获得响应消息

窗口滑动法

被发送的包都存在于接收缓存区,如果数据到达的速度比处理这些数据并传递给应用程序的速度还快,那么就会溢出;接收方每次将数据传递给应用程序时,都会等着和当前要返回的ACK组合一起发送(当前最新的ACK才是数据收发重要的部分)

5.关闭连接
  1. 服务器端应用程序调用close程序,协议栈产生包含断开信息的TCP头部(控制位的FIN设置为1)
  2. 服务器端协议栈委托IP模块向客户端发送数据,同时修改服务器端的套接字
  3. 客户端接收到该网络包,发现其中FIN为1的TCP头部,会将自己的套接字标记为断开,然后通过ACK告知服务器已经接受到断开的包
  4. 应用程序使用read来调用数据时,协议栈就会告诉程序来自服务器的所有数据都已收到。此时应用程序会调用close断开连接
  5. 协议栈也会向服务器发送FIN为1的TCP包
  6. 最后服务器端接收该TCP包,并返回ACK完成整个断开的过程

套接字会等待一定的时间再删除,至少得等双方都接收到对方的ACK

3.以太包的收发

1.包的构成

数据+TCP头部构成包

包+IP地址构成IP包

IP包+MAC头部构成以太网包

2.数据收发

客户端:应用程序生成数据,传递给TCP模块,加上TCP头部,再传给IP模块,生成头部=IP地址+MAC地址,最后传递给网卡通过网卡将数字信号转变成为模拟信号(电信号、光信号),最后通过网线发送出去

集线器:存在一个以太网协议表,存储着MAC头部对应的IP路由器位置,进而能找到下一路由器

路由器类似于客户端

最终找到服务器

注意点

  1. 其中IP地址指示了下一个IP转发设备(路由器)的位置,同时会产生一个以太网地址(MAC地址)用来指示集线器位置
  2. 网卡:插在计算机主板上的板卡、笔记本电脑上的PCMCIA卡、计算机主板上的集成芯片
  3. TCP模块在收发数据时会根据不同的数据包采用不同的网络包来实现多种功能;IP模块将后面的包看成一块完整的二进制数据,其只关注包存不存在,所以对于不同的包都是一样的。
3.IP模块
1.设置IP头部

版本号4、头部长度、服务类型(包的优先级)、总长度、ID号(包的编号,分片具有同一编号)、标志(是否允许分片,是否分片,2bit有效)、分片偏移量、生存时间(可经历路由器数)、协议号(根据上层协议TCP/UDP设置对应的值(十六进制)、发送接收方IP、头部检验和、可选字段

2.怎么找到下一个路由器?(路由表)
  1. 应用程序将通信对象IP告知该模块
  2. 该模块从路由表中查询应当用哪一个网卡发送到哪一个路由器

路由表

由通信对象IP地址(Network Destination)及掩码(Netmask),自身网卡(Interface) ,下一个路由器IP(Gateway) ,传输成本(Metric)

3.为了发送到该路由器,需要通过哪个集线器?(MAC头部,ARP)

利用地址解析协议(ARP),将下一路由器的IP广播到同一以太网内的所有设备,设备反馈自身的MAC号。(存在缓存)

MAC格式:00-80-C8-2D-82-EA / 00:80:C8:2D:82:EA

接受发送方的MAC地址,以太类型(使用的协议类型 ARP、IP、IPv6、IEEE802.3)

4.为什么要将MAC以太网的工作委托给IP?

让IP完成整个打包能让网卡对各种包都进行同一操作

4.以太网(类似于无线局域网)
  1. 将包发送到MAC的接收方代表的地址
  2. 用发送方MAC识别发送方
  3. 用以太类型识别包内容

原型

利用网线连接的能够完成多台计算机彼此自由和廉价通信而设计的通信技术,以主干网线利用交换机得到分支,所有的设备都会获得发出的所有信息

中继式集线器

将主干网线变成中继式集线器,将收发器变成双绞线,仍是广播式

交换式集线器(交换机)

信号只会传输到对应的MAC位置。

5.网卡
1.组成

1.缓冲区:将IP模块获得的数据包存储

2.MAC:添加三个信息,控制碰撞检测,重发等以太网收发操作

3.PHY(MAU):发送和接收信号的电路

4.RJ-45接口:连接网线的插座

2.过程
  1. 操作系统控制网卡驱动程序初始化:驱动程序读取ROM中唯一的MAC并分配给MAC模块,错误检查

  2. 从IP模块将包存储到缓冲区

  3. 向MAC模块发送“发送包”的指令

  4. MAC取出数据,加上报头(测定时机)起始帧分界符(SFD,帧的起始位置)以及帧校验序列(FCS,发送方对数据长度的统计),最后将数字信息按照每一个比特转换为电信号(转换速度即为网络传输速度)

  5. PHY(MAU)会将信号转换为可在网线上传输的格式,并通过网线发送出去,此模块还会监控接收电路是否有信号传入

  6. …信号传输中

  7. 接收时大致顺序相反,但是需要先检验FCS(计算本次接收数据长度和FCS长度是否相同),然后MAC头部中分配的网址和自身网址是否相同

  8. 数据接收成功,存储到缓冲区中,网卡会向扩展总线发送信号,通过计算机中的中断控制器完成CPU的中断请求

  9. 网卡驱动被中断处理程序调用后会从网卡的缓冲区中取出收到的包,通过MAC头部中的以太类型判断协议,进而交给不同的协议栈

  10. 协议栈会检查头部判断IP是不是发给自己的,如果不是,那么会通过ICMP消息将错误告知发送方;

    分片重组:如果IP模块检测到接收包为分片包,那么IP模块会将其暂存在内存中,等待IP头部中具有相同ID的包全部到达

6.TCP与UDP

TCP的设计:为了实现高效的传输,避免重发已经送达的包,只重发哪些出错的或者未送达的包,保持对包的监控来稳定发送质量

UDP的设计:当数据内容很少(一个包即可囊括)或者丢失一小部分影响不大(音视频)时,那么只需要发送这一个包,如果要全部重发也只是重发一个包,同时将对方回复的数据当做接收确认的信号,不会监控包的状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值