目录
[2>.版本 与 首部长度](#2>.版本 与 首部长度)
[3>.服务类型(type of service)](#3>.服务类型(type of service))
[5>.16位标识 + 3位标志 + 13位片偏移](#5>.16位标识 + 3位标志 + 13位片偏移)
[8>:8位协议 与 16位首部校验和](#8>:8位协议 与 16位首部校验和)
[五: DNS(域名系统)](#五: DNS(域名系统))
通过之前的回显服务器编写,我们简单了解TCP 与UDP的特点,可对于面试来说,这点知识是不够的,所以这个博客用于面试顺便加深了解
前言:TCP/IP五层协议

接下来了解每一层具体的使用
一.应用层
1.应用程序所在地就是应用层,平时编写的代码就是在应用层编写
2.应用层包括
(1).自定义协议
自定义协议就是前后端接口交互的的规定 ,规定了数据的传输信息 (前端后端之间如何互相传输数据),确定了传输的数据格式(传输的数据以怎样的格式传递)
(2).现有的协议,其中最具有代表性的为HTTP协议
二.传输层
传输层包括一堆协议,最典型的为UDP协议与TCP协议
1.数据的协议封装与分用
数据进入每一层都需要对应的协议封装,如:


这只是传输,接收方从物理层接收数据后,需要一步一步解析到应用层数据包,最终才能收到消息,这个解析过程称为"分用"
2.UDP协议
UDP传输是以数据报进行传输
1>:对应用层数据包的封装格式
官方给定:

这个图看着不能很好表达效果,优化一下:

2>:源端口号与目标端口号
UDP进行传输,源端口 是发送方使用的端口,目标端口是接收方使用的端口,用于确定数据发送或返回到那个服务上
3>:知名端口
端口号的大小为2个字节(0-65535),而一般写服务器指定端口号不选择0 - 1023,因为这个范围是知名端口的范围
知名端口 :早期计算机在传输层 为一些重要的服务 提供的端口号,范围在0 - 1023
如:ssh服务器用22端口 ,http服务器用80号端口等
小知识:
a .知名端口代表建议使用该端口 ,eg:建议http服务器使用80端口,但也可以使用其他未冲突端口
b .随着时代更新,一些服务早已被淘汰,但知名端口范围未缩减,依旧是0-1023
4>:UDP长度
长度 2字节,取值范围: 0 - 65535,单位字节, 表示整个UDP包括报头+载荷的长度 ,但报头大小为8字节,所以一般描述载荷(数据)的大小
问题:一个UDP长度为2字节,数值表示最大为65535个字节,即:64kb,若传输的数据大小超过64kb怎么办?
a.在应用层拆包解包
接着这两个数据包后续进行封装,通过物理层传输到对方物理层开始进行分用,直到应用层进行解包组合操作
优点 :将大数据进行传送 缺点:实现太复杂
b.采用TCP协议
因为TCP是面向字节流,不用担心数据大小
5>:检验和(checksum)
UDP的特点是容易丢包 ,所以在传输之前,会将当前数据 按照一定的方式通过数学公式计算一个值checksum1 ,等传输后,再回根据当前数据进行计算校验值checksum2,若checksum1 = checksum2,表示传输没问题,但不能完全解决丢包,万一整个数据都丢了呢~~
6>:特点

7>:总结
基于UDP特点,若本身不容丢包,且对传输效率较高,不要求建立连接可用UDP
3.TCP协议
注意: 前四个标题解释封装格式,至于剩下的会在TCP的特点中讲到
1>:对应用层数据包的封装格式

2>:源端口、目标端口与校验和
这三个与UDP一样,这里就不介绍了
3>:首部长度
长度为4bit,取值范围: 0 - 15,描述了报头长度
eg:当首部长度取值 15,因为协议规定单位为4字节,代表报头大小: 15 × 4 = 60字节
4>:保留位
核心功能为TCP后续扩展预留空间(如:流量控制、安全标识等)
5>:特点
在UDP中,数据以数据报的形式传输,若成功发送或者中途出现丢包,因为无连接性无法确定数据是否传递过去,会造成用UDP发送一个重要信息,结果因为不清楚对方是否收到,造成种种安全隐患
在TCP中,虽然无法保证数据100%传递,但能确定对方是否收到该数据
接下来讲:TCP的可靠传输
(1).确认应答
核心:数据发送后,对方会返回一个应答报文(ack),代表收到该消息
如:

上述可以理解为一次TCP传输过程,此时暧昧对象说的"可以呀"就是应答报文(ack),我通过这个ack就知道信息成功发送且她答应了
应答报文是特殊的报文,没有载荷,此时这里的ack = 1,表示应答报文
(2).网络传输的后发先至问题+序列号与确认序列号
比如:

这种后发先至问题会造成什么影响,大家都知道,不多赘述
那么如何处理呢,暧昧对象可以引用这些话,分别说:"可以"、 " 一边去",这样即使出现后发先至我也知道她的回答,此时这里的"引用这些话"相当于编号
TCP为了解决这种问题,按照序列号 给传输的数据按照字节编号 ,最后对方按照编号进行排序 ,并返回一个ack (我收到数据,并且期望下次传输时的起始编号 是多少(确认序号))

所以:
32位序号列: 随机产生一个数字,作为传送数据的起始数字编号
32位确定序号:
**(1).**返回当前接受的数字编号的最大值+1
(2). 代表发送方当前传输的数据成功被接收
重点 :32序号列是随机产生一个数字作为起始编号,不是从固定值开始,为了防止序号被预测数据被攻击、应对残留报文

接下来讲 :TCP如何确保"尽可能把数据完整传输" ,即:抵抗丢包
(3).超时重传
在数据传输过程中,丢包是普遍现象,在UDP传输时,为了速度会经常产生丢包现象,在TCP则会超时重传
如:

假设发送的过程中出错,就会出现这种情况
具体情况如下:
第一次发送等待 t1 时间接收ack,若时间超出 t1,再重新发送,继续等待 t2 时间接收ack,若时间超出 t2,再重发并且成功接收ack,此时每一次的时间间隔越来越大,即:t2 > t1
若连续发送多次都是发送错误,没必要继续重传浪费系统资源 ,会认为当前出现严重的网络错误,会断开当前连接
此外,若返回值ack出现丢包,如:

此时,有人问了,发送方一直发送数据,那接收方那边会不会造成数据冗余??不会的

(4).小总结:
TCP的特点之一可靠传输的体现:
a. 数据发送过去对方会给反馈
b. 传输的数据即使乱序 ,也会重新排序保证数据的正确性
c. 即使出现丢包 ,也会触发超时重传
一般来说,除非网络问题,多触发几次超时重传都会成功传输
d.超时重传与确认应答是TCP实现可靠传输的核心概念
接下来讲TCP的"有连接性"
(5).连接管理
开始连接:
TCP的特点之一:有连接性 ,在之前TCP的回显服务器中,客户端在构造方法处 就会与服务器建立连接,具体的连接过程称为"三次握手"
简略图如下:

详细图如下:

问题一:3次握手,那有没有四次握手、五次握手等等?

问题二:三次握手的意义?
1. 先初步确定通信是否通畅 ,是后续传输大量数据的前提
2 .验证对方的发送与接收能力是否正常
3. 进行一些参数的协商工作,如:数据的起始序列号
断开连接:
连接需要三次握手,那么对应的断开连接 则涉及 "四次挥手"

问题:为什么不是三次挥手?
这里 ack 与 fin 不能一起传输,因为ack由操作系统内核控制 ,反应快;而fin 由应用程序控制,反应较慢
回顾之前回显服务器:

(6).TCP的状态
分为两个过程:建立连接 与关闭连接
a.建立连接
为了方便大家了解,先给出连接过程的图解与对应状态
LISTEN状态 :服务器准备就绪,随时可以被客户端连接
只运行服务器:

ESTABLISTEN :表示当前连接可以通信
接着运行客户端:

SYN_RENT(连接发送) 与 SYN_RCVD(连接收到)
当客户端发送syc进入SYN_RENT状态 ,服务器接收syc进入SYN_RCVD状态 ,等连接完成进入ESTABLELISHED状态
因为连接速度快,肉眼不容易观察,若某天电脑观察到这个现象,请仔细检查网络或代码逻辑
b.删除连接
为了方便大家了解,先给出关闭连接过程的图解与对应状态
这些关闭过程运行很快,肉眼无法观察,所以采取文字叙述
1:客户端发起关闭请求(FIN_WAIT_1 状态)
客户端(主动关闭方 )发送一个 FIN (结束)报文,表示要关闭从客户端到服务器的连接。 此时客户端进入 FIN_WAIT_1 状态
2:服务器确认关闭请求(CLOSE_WAIT 状态)
服务器 FIN 报文,会发送一个ACK (确认)报文,来确认客户端的关闭请求。此时服务器进入 CLOSE_WAIT 状态,表示服务器可以准备关闭连接了,等待调用close()关闭连接
3:服务器发起关闭请求(LAST_ACK 状态)
服务器调用close方法关后,在关闭之前,会发送一个 FIN 报文,表示要关闭从服务器到客户端的连接, 此时服务器进入 LAST_ACK 状态
4:客户端确认并等待(TIME_WAIT 状态)
客户端收到FIN 报文段后,会发送一个 ACK 报文来确认服务器的关闭请求。此时客户端进入 TIME_WAIT 状态,需要等待120s,因为此时要处理ack 或者 FIN可能丢包问题和清除旧数据包,若发送ack后就关闭连接,万一出现丢包会导致数据重传服务器无法处理
5:连接完全关闭(CLOSED 状态)
客户端在 TIME_WAIT状态等待一段时间后,会进入CLOSED状态,完全关闭连接。
(7).滑动窗口
没错,就是算法中的滑动窗口,不过那个是根据这里的滑动窗口演化而来
在TCP网络传输中,每次传输一个数据都要等ack确认,这对于大量的数据传输来说速度太慢了,若是每次传输都有一堆数据传输,速度会更快
如图:`

与滑动窗口关系:

出现的问题:
问题一:若出现丢包怎么办?
a.ack丢包

b.数据包丢失

这种"滑动窗口 "的传输方式,在传输中出现数据包丢失 会不停地的提醒对方发送该数字编号对应的数据称为快速重传
一般接收到对方传来的3次提醒,就会重新传输数据,若是传输失败,则启动超时重传
问题二:快速重传与超时重传的区别??
相同 :都是为了可靠性传输 ,保证数据尽可能完整传输
不同:(1).触发方式与响应速度:
a. 超时重传依赖计时器超时触发,响应慢;
b. 快速重传靠接收方发送的3个重复ACK触发,响应快 。
(2).定位与适用场景:a. 超时重传是TCP应对丢包的兜底机制,适用于所有场景(含网络中断);
b. 快速重传是优化机制,仅适用于数据快速传输 与"丢包后后续数据包能正常到达 "的场景,若其失效则启动超时重传。
(3).当快速重传处理不了,就会启动超时重传来处理
(8).流量管理
为了使数据快速传输,引入了滑动窗口,每次把一个窗口的数据传输,极大提高了传输速度,窗口越大,传输效率越大,但并不是越大越好,所以流量管理就是对窗口大小的控制

处理方式:
(1).在建立连接中根据报文 确定初始的窗口大小 ,后续根据对方缓冲区剩余空间进行动态调整
(2).若接收方满了,会暂停发送 ,启动超时重传 ,进入等待 ,若超出等待时间 还未传输数据,会发送无数据的"窗口探测报" ,询问对方有空间传输数据吗?
(9).拥塞窗口
⽹络上有很多的计算机, 可能⽹络状态就⽐较拥堵. 在该情况下, 贸然发送⼤量的数据, 很危险
所以, 网络传输不但要考虑对方的接受能力,还要考虑传输环境阻塞情况

那么拥塞窗口如何解决???放一张图来演示:

1.AB阶段
开始传输数据,此时不知道网络情况,此时从A点会发送很小的数据包 ,称为慢启动 ,若不出现丢包(即网络不阻塞 ),则后续的数据传输速度(即:窗口大小)呈指数增长,直到B点,到达设定的阈值
2.BC段
到达阈值后,在不出现丢包情况下,数据传输速度(即:窗口大小)呈现线性增长
3. C点
到达C点后,出现丢包现象 ,会执行快速重传,接着有两种处理方式(GH 与 DF)
4.第二阶段
DF阶段:
此时阈值 变为丢包位置的一半 ,窗口急速缩小,继续进行上述操作,先慢启动 ,数据呈现指数增长,到达阈值进入线性增长,直到丢包···········
这种传输每次丢包都是慢启动,传输效率太低了,目前早被pass
GH阶段:
此时阈值 变为丢包位置的一半,接 着从该点开始数据传输呈线性增长 ,直到丢包继续让阈值变一半,接着从该点开始线性增长···········
这种传输效率明显得到了优化
所以说流量管理根据对方接收处理数据能力动态改变窗口大小 ,而拥塞控制根据网络环境动态改变窗口大小,这两个共同维护窗口大小
(10).延迟应答
在滑动窗口的数据传输中,每次发送一组数据,接收方都会频繁地发送ack带来了额外开销 ,又因为确认应答的报文后一个ack会包含前一个ack的信息
那么若是可以让一些ack晚点发送,剩下来的资源可以稍微扩大窗口,进一步提高传输速率
如:

可以看到,降低了额外开销,从而进一步增加传输效率
(10).捎带机制
因为延迟机制导致ack会晚点发送,所以会出现这种情况

大概意思就是:在我发送的时候,发现你也要发送,就顺手把你也一起发过去
(11).面向字节流
说到字节流,在文件IO里讲过,其他这里就不多赘述了,主要讲在传输过程的粘包问题

(12).异常情况
正常情况下,连接关闭会涉及四次挥手,但不正常情况如下:
情况一:进程崩溃
当进程奔溃后(无论客户端还是服务器),操作系统都会回收崩溃方所有资源 ,此时内核 向对端发起RST复位操作 ,对端接收后,删除该TCP连接中PCB的文件描述表中对应的资源
情况二:电脑关机
关机后,电脑会等一回儿才息屏,此时进行的操作:
1. 向所有进程发送正常关闭连接 的通知,并给定一定的时间**进行四次挥手,**等待全部进程关闭连接
2. 若关闭成功 ,则会完成关机;否则,会向没有关闭的进程发送进程崩溃的通知进行强制关闭
情况三:电脑掉电
这里掉电指的是硬件设备没有电池,纯靠插电工作,出现突然断电
接收方掉电:

发送方掉电:

情况四:网络断开

(13).内容补充

这些做个了解,因为现在很多少用
6>:UDP与TCP总结
• TCP⽤于可靠传输的情况, 应⽤于⽂件传输, 重要状态更新等场景;
• UDP⽤于对⾼速传输和实时性要求较⾼的通信领域, 例如, 早期的QQ, 视频传输等.
具体还得看应用场景来决定用哪个
三:网络层
网络层的两个目标:
1.地址管理:描述网络上的每个节点(路由器/主机)的IP地址
**2.路由选择:**描述数据传输的路径规划
而接下来讲的网络层的重点IP协议就负责这个
1>.协议格式

2>.版本 与 首部长度
4位版本 :实际上只有两个:ipv4(当前介绍) 与ipv6,后续详细讲到
4位首部长度: 描述报头长度 ,因为选项的存在与否,报头长度是可变的
3>.服务类型(type of service)


4>.16位总长度
与UDP长度一样,最大为64kb,但UDP最大只能传递64kb ,而IP协议传递大小超过64kb,会自动拆包,由接收方自动组包
5>.16位标识 + 3位标志 + 13位片偏移
整体描述了如何拆包+组包


在开始分片时就在重新封装的报文中确定这三个值
6>.8位生存时间
当传输IP数据报时目标地址 填错了,IP数据报在传输中不可能无限传输,此时规定TTL 为传输的次数 (值为32/68/128),表示每经过一个路由器进行一次转发,TTL值减一,当TTL = 0时,数据直接丢失

7>.IP地址

IP采用32bit位表示,最大值约为43亿,现在每个人都有许多联网设备,这些也占用了IP数量,那么43亿够吗????
(1).解决方法:
a.解决IP数量的方法一:动态分配IP数量
根据当前设备是否需要上网,动态决定是否分配IP地址
有些设备是不要上网,例如报废的电脑,那么此时就不会分配IP,减少了IP的数量
b.解决IP数量的方法二:NAT网络地址转换
NAT 本质上提高复用率,让一个IP代表许多IP

其次并规定在不同的局域网内: 内网IP允许重复,外网IP唯一
针对这些就涉及不同的访问规则

每一部分的内网IP转化的外网IP通常是一样的,所以一个外网IP代表一堆内网IP,提高复用率
c.解决IP数量的方法三:使用ipv6
ipv6使用了128bit位代表IP地址,数值为:2^128次方,非常大,都可以把地球每一粒沙子表示
(2).IP地址管理:⽹段划分
网段划分: 在同一个局域网 内,按照多个IP地址划分划分多个网段
IP地址分为两个部分, ⽹络号 和主机号,比如:127.0.0.1,其中127.0.0 是网络号 ,1 是主机号
• ⽹络号: 保证相互连接的两个⽹段具有不同的标识;
• 主机号: 同⼀⽹段内, 主机之间具有相同的⽹络号 , 但是必须有不同的主机号;
先了解路由器的两个接口:LAN口与WAN口
如图:

接下来解释:

问题:为什么修改网络号就无法通信???
首先了解,在局域网内传输数据 前,先会检查目标设备IP地址的网络号与当前设备网络号是否相同 ,若相同,则通过交换机 传输数据;否则,将数据传递给路由器,由路由器进行网络号匹配 ,最终发送数据
那如果我此时修改其中一个网络号,首先肯定不能通过交换机来传输数据,因为网络号不匹配,那么他就会让路由器进行匹配,但由于路由器中未更新这个网络号,在这个局域网内路由器也找不到我对应的设备IP,所以无法通信
(3).子网掩码
网络号必须是前三个吗?不一定,还得看子网掩码
子网掩码 :二进制为1的位数代表ip前多少位为网络号

如图:子网掩码为 255.255.0.0,二进制为: 11111111 11111111 00000000 00000000
有16位为1,表示IP地址前16位为网络号
有的同学还在课本见到老版本的网络号表示:

(4).网关
网关:网络数据传输的入口与开口,由所连接的路由器自动分配值
网络传输的数据总是先发送给网关,再由网关进行剩下的传递工作,接收数据也是如此
(5).特殊的网络IP
a .将IP地址中的主机地址 全部设为0, 就成为了**⽹络号** , 代表这个局域⽹的网段IP;
如我当前的IP为:172.28.58.65,那么局域网IP为:172.28.0.0,不能把这个IP分给机器使用
b. 将IP地址的主机地址全部设为1, 就成为**⼴播地址**, ⽤于给同⼀个网段的所有主机发送数据包
广播地址就是向同一网段内的所有主机发送数据
c. 127.*的IP地址⽤于本机环回(loop back)测试,通常是127.0.0.1
本机回环主要用于测试 ,当我们上线一个软件,首先要在自己的电脑上测试判断可不可行,一般回环地址习惯写成"127.0.0.1"
d.域名
地址全是数字,输入时非常难记,镜就想到用英文单词表示IP地址,假设搜狗的IP为:220.181.125.61, 输入就可以写为**: www.sogou.com**
(5).路由选择
网络数据通过路由传递,那么如何确定数据传输的准确??


这种便是数据传输的路由选择
8>:8位协议 与 16位首部校验和
8位协议:对应着传输层协议类型,由系统自动分配
16为首部校验和:检验首部传输是否正确问题:为什么载荷不用校验,不担心载荷出现传输问题吗?
答: 假设传输UDP或者TCP数据报 ,在IP协议载荷中都有16位校验和确保传输层的数据正确 ,后面在数据链路层 中会有CRC 来保证数据完整性,在双重保险下,不需要担心数据数据完整性,所以网络层对首部进行校验,确保不会传输不会出错,增加效率
四.数据链路层
数据链路层中最著名的协议为以太网(IEEE 802.3)
1>.认识以太网
让家庭、办公室里的电脑、手机、打印机等设备,能通过网线或 Wi-Fi 互相连网、传数据的 "通用规则"。
就比如电脑通过网线进行数据传输与通信所构成的局域网,这就是个以太网,网线称为以太网线
2>.协议格式

3>.目的地址与源地址
(1).介绍
目的地址与源地址是mac地址 ,专门处理两个相邻设备之间的数据传输,大小6字节,数值:2^48, 因为很大**,不需要NAT或动态分配,设备出厂时分配唯一地址,也可作为一个电脑的标识**
如图就是一个mac地址:

IP地址与mac地址区别:
IP地址的分配是站在宏观角度上,规定大方向的数据走向
mac地址是用于两个相邻节点之间的具体数据走向
(2).mac地址的数据传输

可以清楚看出IP规定大方向,而MAC处理相邻位置的具体走向
4>:类型
(1).介绍
类型为2字节,按照取值的不同来选择后续的载荷格式

(2).ARP请求/应答
对于网络层 ,内部有路由表 ,通过此表可以判断数据走的LAN 口或WAN口,而在数据链路层 存在转发表,存储相邻节点的具体信息,通过此表可以快速确定数据的走向

5>:CRC
crc校验和:4位,进行最后的数据检验,后续到物理层进行传输
6>:MTU 与 MSS
MTU:单次传递载荷允许不分包的最大长度,最大为:1500字节,约等于1.5kB,当载荷超过1.5kb,会自动分包

既然会进行拆包,为了传输效率,规定了MSS
MSS:单次的最大有效数据长度,默认1460字节(MTU最大值 - IP报头 - TCP 报头)
五: DNS(域名系统)
对于访问网页而言,记住IP非常麻烦,所以用英文单词代表IP,并把对应的映射关系存储在DNS中,访问时就会解析(有点类似HASH)
开始的DNS为一个hosts文件


但因为host是个记事本,每次修改要在记事本挨个修改,太麻烦了,所以后来升级为DNS,自动对域名与IP进行修改
但当同一时间大量数据进行访问,DNS解析也会崩溃,此时的解决办法
方法一:放入缓存区
访问某个网站后,会把对应的域名IP映射放在访问端的缓存区,后续若再次进行访问,从缓存区中拿取
方法二:采取分布式
采用多个服务器维护DNS
六.总结
1.应用层
• 应⽤层的作⽤: 满⾜我们⽇常需求的⽹络程序, 都是在应⽤层
• 能够根据⾃⼰的需求, 设计应⽤层协议.
• 理解DNS的原理和⼯作流程
2.传输层
• 传输层的作⽤: 负责数据能够从发送端传输接收端.
• 理解端⼝号的概念.
• 认识UDP协议, 了解UDP协议的特点.
• 认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.
• 掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗⼝, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性.
• 理解TCP⾯向字节流, 理解粘包问题和解决⽅案.
• 能够基于UDP实现可靠传输.
• 理解MTU对UDP/TCP的影响.
3.网络层
⽹络层的作⽤: 在复杂的⽹络环境中确定⼀个合适的路径.
• 理解IP地址, 理解IP地址和MAC地址的区别.
• 理解IP协议格式.
• 了解⽹段划分⽅法
• 理解如何解决IP数⽬不⾜的问题, 掌握⽹段划分的两种⽅案. 理解私有IP和公⽹IP
• 理解⽹络层的IP地址路由过程. 理解⼀个数据包如何跨越⽹段到达最终⽬的地.
• 理解IP数据包分包的原因.
• 了解NAT设备的⼯作原理.
4.数据链路层
数据链路层的作⽤: 两个设备(同⼀种数据链路节点)之间进⾏传递数据
• 以太⽹是⼀种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理层的内容. 例如: 规定了⽹络 拓扑结构, 访问控制⽅式, 传输速率等;
• 以太⽹帧格式
• 理解mac地址
• 理解arp协议
• 理解MTU
如果对你有用,点个赞吧~~~