概述
观他人所观,想他人所未想。
目录
2.1 创建套接字
2.2 连接服务器
2.3 收发数据
2.4 从服务器断开并删除套接字
2.5 IP与以太网的包收发操作
2.6 UDP协议的收发操作
本章看点:
- 创建套接字
- 连接
- 通信
- 断开连接并删除套接字
- IP与以太网的包收发操作
- 用UDP协议收发数据的操作
2.1 创建套接字
2.1.1 协议栈的内部结构
-
邮件、浏览器等收发数据使用TCP;DNS服务器等收发较短的控制数据时用UDP
-
将网络包发送给通信对象的操作由IP负责
-
IP下面的网卡驱动程序负责控制网卡硬件
-
最下面的网卡负责实际操作
2.1.2 套接字的实体就是通信控制信息
- 在协议栈内部有一块用于存放控制信息的内存空间,可以说这就是套接字的实体
- 协议栈是根据套接字中记录的控制信息来工作的
- windows中可以用netstat -ano命令显示套接字(每一行就相当于一对套接字)
- PID:process ID,进程标识符(操作系统为了标识程序而分配的编号)
- 套接字中必须要记录是否已经收到响应,以及发送数据后经过了多长时间
2.1.3 调用socket时的操作
- 创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态
- 接下来,将这个套接字的描述符告诉应用程序
- 应用程序向协议栈进行收发数据委托时就需要提供这个描述符
2.2 连接服务器
2.2.1 连接是什么意思
- 通信双方交换控制信息,在套接字中记录这些必要信息并准备数据收发的一连串操作
- 此外,还需要一块用来临时存放要收发的数据的内存空间(缓冲区)
2.2.2 负责保存控制信息的头部
控制信息分为两类:
- 头部中记录的信息(整个通信过程都需要)(头部是用来交换和记录控制信息的)
- 套接字(协议栈的内存空间)中记录的信息
在连接、断开等没有应用程序数据的情况下,双方只传递控制信息
2.2.3 连接操作的实际过程(大致流程)
- 应用程序调用connect
- IP、端口号等信息传递给TCP模块
- 创建TCP头部(包括端口号、序号、ACK等一系列控制信息)
- TCP模块将信息传递给IP并委托其发送
- 服务器上的IP模块会将接收到的数据传给TCP模块
- 找到TCP头部中的套接字信息
- 状态改为正在连接
- 返回响应(此过程和客户端一样)
2.3 收发数据
2.3.1 将HTTP请求消息交给协议栈
- 协议栈并不关心应用程序传来的是什么数据
- 协议栈并不是一收到数据就发出去,而是存在缓冲区,等待下一段数据(如果马上发出去,可能会发送大量小包,导致网络效率下降)
- MTU:最大传输单元Maximum Transmission unit,以太网一般为1500B
- MSS:最大分段大小Maximum Segment Size,除去头部,一个网络包所能容纳的数据最大长度
- MTU和MSS是基于以太网和通信线路上网络包的最大长度计算的
数据在何时发送,根据以下两个要素判断:
- 判断是否达到MSS
- 时间,当发送频率不高时,若每次都等到MSS,可能会因等待时间过长而造成网络延迟,因此协议栈内部有一个定时器,一定时间后,就会发送
这样的发送时机判断其实不甚完美,因此,应用程序在发送数据时可以指定一些选项
2.3.2 对较大的数据进行拆分
- 在每块数据前加上TCP头部
2.3.3 使用ACK号确认网络包已收到
TCP协议非常强大,无论网络中发生任何错误,都可以重传网络包,因此,网卡、集线器、路由器都没有错误补偿机制,一旦检测到错误就直接丢弃相应的包
2.3.4 根据网络包平均往返时间调整ACK号等待时间
TCP采用了动态调整时间的方法 ,根据ACK号返回所需的时间来判断
2.3.5 使用窗口有效管理ACK号
- 滑动窗口方式:有效利用等待ACK的时间
- 接收方需要告知发送方自己的缓冲区大小,避免缓冲区溢出
- 窗口大小:能接受的最大数据量,一般和接收方的缓冲区大小一致,它是TCP调优参数中非常有名的一个
2.3.6 ACK与窗口合并
- 更新窗口大小的时机:接收方将数据传递给应用程序,导致接收缓冲区容量增加时
- 返回ACK号的时机:接受操作完成后就需要(再过一段时间,数据传到应用程序之后才需要更新窗口)
- 这样一来,接受方发送的包可能很多,导致网络效率下降
- 因此,并不会马上发送包,而是等待一段时间,将ACK号和窗口更新最新数据放到一个包,再发送
2.3.7 接受HTTP响应消息
协议栈将数据块暂存到缓冲区,并将数据连接起来还原数据,最后将其交给应用程序
2.4 从服务器断开并删除套接字
2.4.1 数据发送完毕后断开连接
2.4.2 删除套接字
一般会等待一段时间(可能几分钟),再删除,是为了防止误操作
2.5 IP与以太网的包收发操作
2.5.1 包的基本知识
- 头部+数据
- TCP/IP包:MAC头部+IP头部+TCP头部+数据块
- 一般来说,TCP头部和数据块加起来,就是包的内容
转发设备中,有一张记录了什么地址往哪发的表,根据头部信息查询,就可以判断出包的方向
发送和接受方称为终端节点,转发设备中间节点或转发节点
2.5.2 包收发操作概览
- IP模块是包传输的入口,实际传输包的是集线器、路由器等网络设备
- IP头部有IP协议规定的、根据IP地址将包发往目的地所需的控制信息
- MAC头部包含通过以太网的局域网将包传输至最近的路由器所需的控制信息(凡是局域网使用的头部都叫MAC头部)
- TCP模块在收发数据时会分为好几个阶段,并为各个阶段设计了实现相应功能的网络包,但IP的包收发操作都是相同的
2.5.3 生成包含接受方IP地址的IP头
- 确定发送方IP地址:需要判断发送所使用的网卡(如果计算机配有多个网卡),然后使用该网卡的IP地址
- 路由表:Routing Table,路由器使用路由表判断下一个路由器位置
- 可使用route print命令查看路由表
- 网关:gateway,就是路由器
- IP头中还有协议号,表示包来自哪个模块(TCP:06)
2.5.4 生成以太网用的MAC头部
以太网在判断网络包目的地是和TCP/IP的方式不同,因此需要MAC头
MAC头:接收方和发送反MAC地址、以太类型(和协议号类似,以太包的类型,IP:0800)
2.5.5 用ARP查询目标路由器的MAC地址
- ARP:address resolution protocol,地址解析协议
- 广播获取
2.5.6 以太网基本知识
以太网和IP一样,并不关心网络包的实际内容,因此以太网的收发操作和TCP的工作阶段无关,和应用程序的种类也无关
2.5.7 将IP包转换成电或光信号发送出去
- 计算机启动操作系统时,网卡驱动程序会对硬件初始化
- 网卡中保存的MAC地址会由网卡驱动读取并分配给MAC模块
网卡:
- 缓冲区
- MAC模块(1.给网络包再加3个控制信息,2.将数字信息转换为通用电信号)
- PHY(MAU):用于发送接受信号的电路
- RJ-45接口
2.5.8 给网络包再加3个控制数据
- 报头:确定包的读取时机(不能一开始就发送数据,要在前面加上一段用来测量时钟信号的特殊信号)
- 起始帧分界符:SFD,表示包起始位置
- FCS:帧校验序列
2.5.9 向集线器发送网络包
- MAC模块将数字信息转换为电信号(生成通用信号)
- 由PHY/MAU转换成可在网线中传输的格式,并发送出去(MAU:medium attachment unit介质连接单元, PHY:physical layer device物理层装置,在速率为100Mbit/s以上的以太网中都叫PHY)
- PHY模块还要监控有无信号进来
2.5.10 接受返回包
- 此过程大致和发送过程一样
- 网卡向中断信号线发送信号,中断处理程序调用网卡驱动
2.5.11 将服务器的响应包从IP传递给TCP
- 检查IP头
- 查看IP地址
- 若有错误,IP通过ICMP消息将其告知发送方
- IP会进行分片重组
- TCP和IP作为一个整体来看待,可以带来更大的灵活性
2.6 UDP协议的收发操作
2.6.1 不需要重发的数据用UDP更高效
为了实现高效的传输,我们要避免重发已经送达的包,只重发出错的。TCP之所以复杂,就是因为要实现这个。
2.6.2 控制用短数据
像DNS查询等交换控制信息的操作基本上都可以用一个包就能解决
2.6.3 音频和视频数据
这些数据缺少了某些包不会引起严重问题,不过是失真、卡顿(除非要求严格)
最后
以上就是昏睡蜜蜂为你收集整理的2.探索协议栈和网卡的全部内容,希望文章能够帮你解决2.探索协议栈和网卡所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复