「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。
点赞收藏不迷路
引言
网络是一个很神奇的东西,它能为天南地北的两个人建立起沟通的桥梁。这一次我将为各位家人们聊一聊我所知道的tcp、ip协议。
网络模型
国际标准组织一开始是制定了七层网络模型。但是吧,标准的东西都比较复杂。后来实际应用中发现网络模型分为四层更合适,即:应用层->传输层->网络层->网络接口层。后来又为了方便系统学习网络模型,又将网络接口层拆分为:数据链路层和物理层,即五层网络模型。
请求过程
当我们在浏览这篇文章的时候,是由浏览器的应用层封装我们的请求数据,顺着网络模型依次交给客户端这边的物理层,经过每层模型时,会携带上该层所用协议的数据(首部/尾部数据)然后经过各种链路,到达服务器的物理层,然后顺着网络模型依次交给服务器端的应用层,这过程中每层会将发送方对应层的协议封装的数据解封,最后由应用层展示发送的源数据。 【网络模型图,网上很多,我就不找了】
各层协议
| 协议 | 数据格式 | |
|---|---|---|
| 应用层 | FTP, HTTP, SMTP, DNS, DHCP | 报文 |
| 传输层 | TCP, UDP | 段 |
| 网络层 | IP, ARP ,ICMP | 包 |
| 数据链路层 | CSMA/CD, PPP | 帧 |
| 物理层 | 比特流 |
物理层
给大伙讲讲物理层的几个概念
链路
-
两台设备之间的传输介质就是链路,例如计算机与路由器之间的网线,两台路由器之间的网线。实际网络中数据的传输会经过很多条链路。
-
不同设备之间的可能链路不一样,即使用的通信协议也不一样,例如集线器组成的网络使用的就是CSMA/CD协议,而两个路由器之间使用PPP协议进行通信。
信道
顾名思义:信息传输的通道,一条传输介质上可以有多条信道。
- 单工信道:信号在传输介质上只能往一个方向传输,比如无线电广播
- 半双工通信:信号可以双向传输,但是同一时间,只能有一个方向的信息进行传输,比如对讲机
- 全双工通信:信号可以同时双向传输,比如打电话双方都可以同时说话。
数据链路层
特点
封装成帧,透明传输,差错检验
封装成帧
- 每一种数据链路层协议都规定了所能传输的单个帧的数据部分(不含帧首部、帧尾部)的长度上限,以太网帧为1500字节。
- 不会接收到大于1500字节的数据,因为数据过大时,会在网络层进行分片。
透明传输
-
数据链路层会将网络层传递过来的数据包,添加该层传输协议的数据,即帧首部和帧尾部。帧的首部和尾部分别包含帧开始符(SOH)和帧结束符(EOT)。
-
如果数据部分存在与SOH及EOT相同的数据,为了防止解析数据失败,需要对数据部分与SOH/EOT同名的数据前面进行字节填充,接收端的数据链路层接收到数据后,去掉填充的字符即可。
差错检验
- 在帧尾部存在一个FCS标志,他是根据数据部分和帧首部计算得出的,接收端可以根据该标志判断数据的完整性。
网络层
数据格式
网络层首部 + 数据部分
首部常见字段
版本
代表当前使用的IP地址版本是ipv4、6
首部长度
二进制值乘以4为首部长度
总长度
首部 + 数据部分的长度之和,最大值为65535字节
由于每帧的数据部分大小不能超过1500字节,所以过大的数据包,需要分片传输给数据链路层,且每一片都会有网络层首部。
标识
数据包的id,当数据包过大,需要进行分片的时候,根据该id可以组合这些片数据。
有一个计数器专门管理数据包的id,每发一个数据包,id就加一。
标志位
第一位:保留
第二位:1代表不允许分片,0分片
第三位:1代表不是最后一片,0代表最后一片
片偏移
数据包分片后,每片在源数据包中的位置,用于接收方还原数据。
就比如一个300字节的数据平分为三段,那么每一段的片偏移就是:0,100,200
生存时间
每经过一个路由器就回减一,当减为0的时候,数据就会被丢弃。
防止数据在路由器中发生死循环
各个操作系统默认的值不一样
协议
使用什么协议封装传输层传递过来的数据段
首部校验和
用于检查首部是否有错误
传输层
家人们,要开始讲tcp/ip协议了啊
数据格式
传输层首部+数据部分 //没有尾部奥
首先呢,传输层是只有两个协议的TCP和UDP
tcp、udp区别
| TCP | UDP | |
|---|---|---|
| 连接类型 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输,不丢包 | 不可靠,只负责发数据 |
| 首部数据大小 | 大 | 小 |
| 传输速率 | 慢 | 快 |
| 资源消耗 | 大 | 小 |
| 资源消耗 | 浏览网页,文件传输 | 直播,视频语音 |
udp的首部
udp因为是无连接的,只负责发送数据,不管对方是否成功接收,所以它的首部只有:16位源端口号,16位目的端口号,16位UDP长度,16位校验和 = 共8字节
tcp的首部
tcp首部就很多东西了啊
序号
用户传输的数据的每个字节都有编号。当数据过大时,会进行拆分,多次传输。
拆分的数据段的首部会包含该数据段的首字节号,称为序号。用于接收方组合数据,类似网络层的片偏移。
确认号ack
期望对方下一次传过来的tcp数据部分的首字节编号。
例如:用户需要发送一个文件(共300字节),在传输层切分为多个数据段(1-100,101-200,201-300),每个数据段都包含首部 + 数据部分。然后将这三段数据发送出去。接收方收到每段数据后都会响应确认号。例如收到了1-100段,会响应确认号ack为101。
接收窗口
告知对方下一次允许发送的数据大小
标志位
URG:当为1时,紧急指针才有效,表明当前报文段中有紧急数据,应优先传送。
ACK:当为1时,确认号ack才有效。
RST:当为1时,表明连接出现错误,将断开重连。
SYN:当SYN=1,ACK=0时,表明这是一个建立连接的请求,如果对方同意建立连接会响应SYN=1,ACK=1
FIN:当为1时,表明数据已发送完毕,需要断开连接。
tcp特点
可靠传输,流量控制,拥塞控制
可靠传输
停止等待ARQ协议
-
发送方发送一段数据,等待接收方响应后,再继续发送下一段数据。
-
发送方发送数据后,开始计时,一段时间内没有收到响应就会重新发送上一次的数据。
-
问题:如果一个包重新发送了n次还是失败了,会一直重传吗?
- 不会,操作系统会设置重传的次数,超过次数就会发送RST标志,断开连接,并重新建立连接。
连续ARQ协议 + 滑动窗口协议
-
不再发送一段数据就等待确认了,而是根据对方的接收窗口大小,发送一组数据段,再等待确认。
-
问题1:如果接收窗口最多接收4个包,而发送方只发了2个包,怎么办?
- 接收方会等待一段时间后响应收到了两个包,客户端会根据响应的ack,重发第3,4个包
-
问题2:如果M1-M4四个包中丢失了M3,接收方怎么处理?
- 按理说会响应ack=301的,即需要重新发送,M3-M4段。但是为了避免重复发送,衍生出了
SACK选择性确认技术。会告诉发送方只需要发送丢失的M3即可。 - SACK信息存储在传输层首部的选项部分。
- 按理说会响应ack=301的,即需要重新发送,M3-M4段。但是为了避免重复发送,衍生出了
-
问题3:为什么数据在传输层进行拆分,而不是让网络层进行拆分?
- 因为传输层的tcp协议有可靠传输功能,在该层分解可以保证数据的完整性。
- 如果在网络层分解,一旦丢失一个包,到达对方传输层的时候,因为可靠传输的特点,不完整的数据包会被丢弃,并要求发送方重新发送完整的文件,已经接收的文件都会被丢弃。
选择性确认SACK
看上面的问题2,在这里在写一次是想重点提一下这个技术
流量控制
让发送方的发送速率不要太快,让接收方来得及接收处理
原理
-
通过确认报文中的窗口字段来控制发送方的发送速率
-
发送方的发送窗口大小不能超过接收方给出的接收窗口大小
-
当发送方接收到接收窗口大小为0时,发送方会停止发送数据
问题:如果某个时间,接收方发送了0窗口的报文段,后面又有了一些存储空间,给发送方发送的非0窗口报文段丢失了,怎么办?
- 发送方收到0窗口通知时,会停止发送报文,并且同时开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小,如果接收的窗口大小依然为0,则再次刷新定时器。
拥塞控制
防止过多的数据注入到网络中,防止网络中的链路过载。
这听起来是不是跟流量控制有点像,其实他们还是有区别的奥。
拥塞控制和流量控制的区别
流量控制是针对传输层点到点的通信控制,而拥塞控制是一个全局性的过程,涉及到网络中的所有主机、链路了。共同维护的一个环境。
四个阶段
-
慢开始
-
拥塞避免
-
快速重传
-
快速恢复
1,拥塞窗口
-
发送方根据接收方设置的接收窗口和拥塞窗口,发送数据包最大不能超过两者的最小值。
-
拥塞窗口会随着数据传输的过程不断地发生变化。
2,慢开始与拥塞避免
慢开始: 初始的时候拥塞窗口为一个最大报文段的大小,阈值为一直默认值(图中为16,具体由操作系统设置),随着数据包被确认,拥塞窗口呈指数增长。当到达阈值后,拥塞窗口与阈值都呈线性增长。当遇到网络拥塞(触发超时)时,拥塞窗口恢复初始值,阈值为初始阈值的一半,然后再次开始慢启动算法。
拥塞避免:在cwnd到达设置的阈值后,开始线性缓慢增长
3,快重传
之前数据包丢失,发送端会超时重传,增加了端到端的时延。
那么快重传是什么呢?
快重传就是:
接收方: 每收到一个失序的分组后就立即发出重复的确认,而不是等自己收到一组数据后轮到自己响应时再进行确认
发送方:收到四个(很多文章说三个,他们是把第一个正确的确认没有算进去,大伙知道就行)相同的确认,就立即重传对方尚未收到的报文段,而不必等待超时重传计时器,大大节省了时间。
4,快恢复
当出现了快重传,说明网络出现了拥塞了,这时候不是向老版本算法那样阈值减半,拥塞窗口归为初始值,再执行满开始算法。有了快恢复技术之后,是这样的:拥塞窗口直接为发生拥塞时值的一半(而不是恢复到初始值),再执性线性增长的算法。(这就是快恢复的特点)
三次握手
这一次彻底掌握三次握手
在我们发起http请求之前,会有三次tcp协议连接,即三次握手。
第一步
客户端发起tcp第一次连接,标志位SYN=1,ACK=0
第二步
服务端响应第二次连接,标志位SYN=0,ACK=1,确认号ack=1
第三步
客户端发送第三次连接,标志位SYN=1,ACK=1,
注意:当标志位ACK=1时,确认号才生效。
三次握手做了些啥?
- 建立连接
- 交换信息,比如MSS(能接收的每个数据段的最大大小),接收窗口大小,拥塞窗口大小,是否支持SACK技术,这些信息存在于tcp协议首部的选项部分,共12字节。
为什么要三次握手?
保证连接的稳定性,防止资源浪费。 如果第一次连接请求因为网络延迟,到达对方的时候迟到了。此时该请求已经被客户端作废了,而服务器端还不知道,对此做出响应。接收方丢弃该响应。如果只有两次握手,此时服务器端就以为已经建立了连接,一直在等待客户端发送数据,就造成了服务器端资源的占用。
如果第三次握手失败了,怎么办?
服务器端没有收到第三次握手,会定时发送第二次请求,多次失败后,发送RST标志位,强制断开连接。
四次挥手
这一次彻底掌握四次挥手
客户端发送FIN标志位给服务器,表示自己数据发完了。 服务器响应ACK进行确认 服务器发送FIN标志位,表示自己也发送完了。 客户端响应ACK进行确认 客户端等待两倍MSL(最大分段生存期)后,断开连接。
为什么客户端会等待一段时间再断开?
如果客户端第四次握手之后直接断开。而服务器因为网络原因没有收到第四次握手,会重复发送FIN标志位请求断开连接。如果这个时候客户端那边另一个应用恰好使用了刚才那次连接的端口,就会断开连接。本来是要链接的。这回懂了吧!
为什么是两倍MSL?
MSL是tcp报文在网络中存在的时间 本次连接中的数据会在会在2MSL内失效,防止本次连接的数据误传到下一次连接中。