【网络是怎么连接的】| 【02】TCP/IP数据传输

1、TCP/IP数据传输

在这里插入图片描述

1.1 协议栈的内部结构

协议栈的上半部分分别负责TCP协议收发数据和UDP协议收发数据,下半部分用IP协议控制网络包收发操作(包含ICMP、ARP);
- TCP:一般用于浏览器、邮件等;
- UDP:一般用于较短的控制数据,如DNS查询;
- ICMP:告知网络包传送中,产生的错误以及各种控制信息;
- ARP:IP地址查询相应的以太网MAC地址;

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

协议栈内部存放一块用于存放控制信息的内存空间,该控制信息就是套接字的实体;
	- 该控制信息有通信对象IP地址、端口、进行状态等;
协议栈是根据套接字中记录的控制信息来工作;
window使用netstat显示套接字内容;
	- 参数a:显示所有状态的套接字;
	- 参数n:显示IP地址和端口号;
	- 参数o:显示使用该套接字的程序PID;

在这里插入图片描述

1.3 调用socket时的操作

在这里插入图片描述
当调用socket协议栈如何工作

首先①创建套接字,协议栈根据应用程序申请创建套接字的操作;
	- 协议栈首先分配一个存储套接字控制信息所需的内存空间;
	- 在刚刚创建时,需要初始化控制信息;
套接字创建完成后,会返回一个描述符,用来区分协议栈中的多个套接字;
故只要通过描述符确定了相应的套接字,协议栈即可获取所有的相关信息;

1.4 连接服务器

当创建套接字将使用connect,即②,实际上是通信双方交换控制信息;

当应用程序委托发送数据时,协议栈会如何操作

协议栈将会获取到server的IP地址和端口号等信息;
连接操作中交换信息是根据通信规则来确定的,只要根据执行连接操作,双方就可得到必要的信息,以此来完成数据收发的准备;
在数据收发时,需要一块用来临时存放收发的数据的内存空间;

负责保存控制信息的头部

控制信息分为两类:
【头部中记录的信息】:
- 该信息在整个通信过程(c/s)都是需要的,此类信息会被添加在网络包的开头且被记为TCP、以太网、IP头部等;
【套接字中记录的信息】:
- 用来控制协议栈操作的信息;
- 存储应用程序传递来的信息以及从通信对象中收到的信息;

在这里插入图片描述
在这里插入图片描述
连接操作的实际过程

②中调用connect提供server的IP和端口,该信息会传递给协议栈中的TCP模块;
- 首先client先创建一个包含表示开始数据收发操作的控制信息的头部;
- TCP模块将信息传递给IP模块并委托它进行发送,IP模块将其发送后,server上的IP模块将其接收传递给TCP模块;
- server的TCP模块根据TCP头部找到端口号对应的套接字,即将信息写入套接字,并响应clent;
- 客户端接收响应包,即连接成功;

1.4 收发数据

将HTTP请求消息交给协议栈

数据收发阶段③,协议栈要发送一定长度的二进制字节序;
- 首先协议栈会根据MTU判断数据长度;
- 协议栈会将存放在内部的发送缓冲区,并等待应用程序的下一段数据;
- 缓冲区的长度达到MSS时,即可发送出去;
【MTU】:最大传输单元;
【MSS】:最大分段大小,取出头部后,网络包所能容纳的TCP数据最大长度;

【时间要素】:
- 若发送数据的频率不高,当等待包长度为MSS时在发送会导致延迟;
- 即协议栈内部有一个计时器,当一定时间内,缓冲区内的数据长度没达到MSS也会将其发送出去;

- 但时间和长度两者相互矛盾,必须取其任意一种;

在这里插入图片描述
对较大的数据进行拆分

当提交表单数据过大,发送缓冲区数据会超过MSS长度,即该数据会以MSS为长度进行拆分,放入当独的网络包;

在这里插入图片描述

使用ACK号确认网络包已收到
在这里插入图片描述

TCP模块在拆分数据时,会预先计算数据块开头的字节数;
- 告知接收方数据长度即可知道从第几个字节开始及长度;
- 通过该信息能够检查收到的网络包有没有遗漏;
- 其中序号,不一定从1开始,而时随机值,防止被利用被攻击;
- 通信开始从client向server提供一个序号初始值,server会通过该值计算出ACK并返回给clent;
- 发送过的包都会保存在发送缓冲区,当收到ACK后会将会其删除缓存,若没有收到则重新发送;

在这里插入图片描述
根据网络包平均往返时间调整ACK等待时间

在网络拥塞的情况下ACK号回延迟;TCP采用动态调整等待时间的方法,根据等待ACK返回的时间判断;

使用窗口有效管理
参考Linux网络编程 | TCP协议的【滑动窗口机制】TCP流量控制

当在等待ACK时,如果没有进行其他数据发送,将会浪费时间,故采用滑动窗口方式发送数据,以减少时间浪费;

接收HTTP响应消息

即④获取响应消息;将数据暂存到接收缓冲区;
【刚开始接收数据时】:协议栈尝试将数据取出并传递给应用程序,若此时响应消息还未返回故缓冲区中暂无数据,
此时协议栈会将从接收缓冲区中取出数据并传递给应用程序的工作暂时挂起,等待响应消息到在进行接收操作;

【接收到数据时】:协议栈会先检查数据块和TCP头部内容,判断数据是否有丢失,没有则返回ACK;
将数据块暂存到接收缓冲区,并按顺序还原,提交给应用程序,并在合适的时机向发送方发送窗口更新;

1.5 从服务器断开并删除套接字

断开连接
可用参考详细内容 4.5 TCP运输连接管理

服务器的应用程序会调用close,生成断开信息的TCP头部(FIN为1),协议栈委托IP模块向client发送,且server套接字会记录下断开操作的相关信息;
客户端也会执行相同操作;

在这里插入图片描述

1.5 IP以太网的包收发操作

包的基本概念

包由头部和数据组成;

在这里插入图片描述

发送方的网络设备负责创建包(生成控制信息的头部,附上要发送的数据),包被发往最近的网络转发设备,设备根据头部信息确定往哪发送;
【集线器】:为了判断包接下来往什么方向传输,内部维护一张表,记录目的地信息;
【路由器】:内部维护一张IP协议表,根据IP头部查询发往哪一个路由器;

路由表的转发等操作参考【计算机网络】| 【04】网络层

包收发操作

起点为TCP模块委托IP模块发送包的操作;
【IP模块】:IP模块会将包的内容当作一整块数据,在前加上头部;
封装好后将其交给网卡,网卡将数据转化为电信号或光信号发送;

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

TCP模块将包的收发委托给IP模块,它会生成IP头部附在TCP头部;

在这里插入图片描述
生成以太网的MAC头部

生成IP头部后,IP模块还需要再前面加上MAC头部;
IP地址表示网络包的目的地,通过该地址判断将包发往哪里,以太网判断网络包目的地时和TCP/IP不同,必须采用相匹配的方式即MAC头部;

【MAC地址】:
- MAC地址再网卡生成时就写入ROM中;只有在系统启动中对网卡初始化后才会读取MAC地址,读取操作由网卡驱动来完成;

MAC地址在转发时,在路由表中查找到相匹配的条目,在将包发给网关列中的IP地址即可;

通过ARP查询目标路由器的MAC地址

参考【计算机网络】| 【03】数据链路层详解

给网络包在加3各控制数据

【起始帧分界符】:用来表示包起始位置的标记;
【FCS】:检测数据是否出错;

在这里插入图片描述
向集线器发送网络包

上述封装好的网络包即可发送;
一般使用两种:半双工模式的集线器,全双工模式的交换机;

【PHY/MAU】:介质连接单元,将MAC模块传递的信号发送出去并监控接收线是否由信号;
【集线器下】:
为了避免碰撞,首先要判断网线中是否存在其他设备发送信号;发送信号时
- 首先MAC模块从报头开始将数字信息每个比特转换成电信号,在由PHY或MAU发送出去(对其进行信号格式转换);

【计算机网络】| 【03】数据链路层详解 查看集线器

接收返回包

当包通过FCS校验没问题后,查看MAC头部中地址是否一致;此时会触发中断机制(网卡向总线中的终端信号线发送信号,此时CPU挂起正在处理的任务,
从而来处理调用网卡驱动);

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

首先检测IP头,查看接受方的IP;
【错误】:
若该地址不是自己的,则一定是发生了错误,故IP模块会通过ICMP消息将错误告知发送方;
【正确】:
若接收到的包是分片的,那么IP模块将其进行分片重组,通过IP头部标志字段的标记;

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

1.6 UDP协议的收发操作

控制用的短数据

使用UDP不要交换控制信息,建立、断开连接等步骤,且不具有TCP的确认、窗口等机制;
只需将数据加上UDP头部并交给IP即可,UDP只负责单纯地发送包而已;

【例子】:
- 如DNS服务器查询IP地址;
- 音视频传输,当音乐播放卡顿后,在直接继续后续播放,将其忽略;

猜你喜欢

转载自blog.csdn.net/weixin_45926547/article/details/124960163