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.数据链路层


利用之前的回显服务器编写,我们容易了解TCPUDP的特点,可对于面试来说,这点知识是不够的,所以这个博客用于面试顺便加深了解

前言: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.即使出现丢包,也会触发超时重传

一般来说,除非网络问题,多触发几次超时重传都会成功传输

TCP实现可靠传输的核心概念就是d.超时重传与确认应答

接下来讲TCP的"有连接性"

(5).连接管理

开始连接:

TCP的特点之一:有连接性,在之前TCP的回显服务器中,客户端在构造方法处就会与服务器建立连接,具体的连接过程称为"三次握手"

简略图如下:

详细图如下:

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

疑问二:三次握手的意义?

1.先初步确定通信是否通畅,是后续传输大量数据的前提

2.验证对方的发送与接收能力是否正常

3.进行一些参数的协商工作,如:数据的起始序列号


断开连接:

连接需三次握手,那么对应的断开连接则涉及 "四次挥手"

问题:为什么不是三次挥手?

这里 ackfin不能一起传输,因为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

假设对你有用,点个赞吧~~~

posted @ 2025-10-27 20:59  clnchanpin  阅读(2)  评论(0)    收藏  举报