javaEE 网络原理(TCP UDP)
目录
前言:TCP/IP五层协议
一.应用层
二.传输层
1.数据的协议封装与分用
2.UDP协议
1>:对应用层数据包的封装格式
2>:源端口号与目标端口号
3>:知名端口
4>:UDP长度
5>:检验和(checksum)
6>:特点
7>:总结
3.TCP协议
1>:对应用层数据包的封装格式
2>:源端口、目标端口与校验和
3>:首部长度
4>:保留位
5>:特点
(1).确认应答
(2).网络传输的后发先至问题+序列号与确认序列号
(3).超时重传
(4).小总结:
(5).连接管理
(6).TCP的状态
(7).滑动窗口
(8).流量管理
(9).拥塞窗口
(10).捎带机制
(11).面向字节流
(12).异常情况
(13).内容补充
6>:UDP与TCP总结
三:网络层
1>.协议格式
2>.版本 与 首部长度
3>.服务类型(type of service)
4>.16位总长度
5>.16位标识 + 3位标志 + 13位片偏移
6>.8位生存时间
7>.IP地址
(1).解决方法:
(2).IP地址管理:⽹段划分
(3).子网掩码
(4).网关
(5).路由选择
8>:8位协议 与 16位首部校验和
四.数据链路层
1>.认识以太网
2>.协议格式
3>.目的地址与源地址
(1).介绍
(2).mac地址的数据传输
4>:类型
(1).介绍
(2).ARP请求/应答
5>:CRC
五: DNS(域名系统)
六.总结
1.应用层
2.传输层
3.网络层
4.数据链路层
通过之前的回显服务器编写,我们简单了解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
如果对你有用,点个赞吧~~~