Java--网络原理
1. 计算机网络基础概念
1.局域网、广域网、互联网
局域网的覆盖范围通常在几百米到几公里范围内,传输速度较快。
广域网的覆盖范围跨越城市、国家甚至大洲,覆盖地理范围广泛,但传送速度较慢,受举例和中继设备影响。
广域网是全球范围的网络互联。
2.网络拓扑结构
网络拓扑结构是指网络中各个节点(计算机、服务器、交换机等)之间的物理或逻辑连接方式。
3.OSI七层模型与TCP/IP四层模型
OSI七层模型
应用层 (Application Layer)
表示层 (Presentation Layer)
会话层 (Session Layer)
传输层 (Transport Layer)
网络层 (Network Layer)
数据链路层 (Data Link Layer)
物理层 (Physical Layer)
OSI 七层模型既复杂⼜不实⽤,此处主要讲 TCP/IP五层(四层)模型
TCP/IP五层(四层)模型
应用层:负责程序间的沟通,网络编程就主要针对应用层
传输层:负责两层主机之间的数据传输
网络层:负责地址管理和路由选择
数据链路层:负责设备间的数据帧的传送和识别
物理层:负责光/电的传递方式
2.UDP协议
UDP协议特点:无连接:知道对端的IP和端口号就可以进行传输,不需要进行连接
不可靠:没有确认和重传等机制,无法确认数据是否发送正常
面向数据报:将应用层提交的数据封装成一个个独立的UDP数据报,彼此相互独立。每个数据报拥有完整的源端口,目的端口和长度信息。
(1).UDP协议端格式
16位UDP长度代表整个数据报的最大长度(UDP首部 加 UDP数据)(64KB)
校验和是用来验证数据是否正常传输的:发送方会对数据进行代入特殊公式得到一组校验和,在接收方接收到消息之后,同样会对数据进行代入公式,如果校验和相同,那么就代表数据传输没有问题,反正就代表数据的传输出现了问题。
3.TCP协议
TCP协议特点:有连接,可靠传输,
面向字节流:传输的数据没有边界,所有数据是连续,有序的字节序列,像水流一样。
边界保留:UDP将数据拆分为一个个数据报,接收方读取数据的时候只能一个一个的读取数据报,无法读取某一部分或者将数据报的内容合并读取,好处是可以知道这些数据报对应着发送方的第几次发送。
无边界保留:TCP可以按需要读取任意的字节数,不受限制,坏处是无法知道数据对应着发送端第几次发送
(1).TCP协议端格式:
32位序号:
TCP中的32位序号是用来唯一标识字节流中每个字节的编号,本质上是给连续的字节流打标签,用来解决数据的丢失,乱流和重复问题
TCP因为是面向字节流,数据没有天然的屏障,所以32位序号就是用来赋予每个字节为一身份,用来支撑TCP可靠传输的方式。
当序号达到上限以后:触发序号回绕机制,新序号会从0开始,但是TCP会通过时间戳选项来区分不同循环的序号 窗口机制配合:窗口大小严格限制了未确认字节的最大范围,确保在序号回绕前旧窗口的字节全部被确认完毕,新窗口的范围不会与旧窗口的范围重叠,避免序号混淆。
32位确认序号:
在收到的序号的基础上+1,返回给发送方,目的是告诉发送方确认序号以前的数据都已经收到了,你可以给我确认序号之后的数据了。
4位首部长度(数据偏移):
标识TCP的实际首部长度,告诉接收方首部和数据的边界,避免接收方将首部当作数据处理。
保留位:
协议未来扩展预留的字段,默认置为0
16位窗口大小:
16位窗口大小是用来实现流量控制的核心字段。避免发送方数据发送过快导致接收方的数据缓冲区溢出,导致数据丢失。
16位检验和:
跟UDP的检验和一样,用来确保数据正常传输到接收方。
16位紧急指针:
16位紧急指针本身并不存储数据。当URG位置1的时候,就代表有紧急数据,其值表示从当前开始便宜多少位数据,就是紧急指针的结束位,这些数据需要优先处理。
选项:
用来扩展协议的可选字段
URG:
用来标记紧急数据的一个字段
ACK:
确认应答的字段
PSH:
推送,希望接收方收到PSH置为1的数据立即提交给应用程序。用于减少交互的延迟。
RST:
用于强制中断TCP连接,不用遵循四次挥手,告诉接收方连接出现异常或错误,需要立即断开,接收方收到后就会直接中断连接,释放资源。
SYN:
表示当前报文是一个连接确认请求,并且交换双方的初始序列号。
FIN:
用于请求中止连接。
TCP十大核心机制:超级重要!!
1.确认应答
当接收方接收到数据之后,就会返回给发送方一个ACK标志位为1的报文,用来告知发送方说数据已经收到了。
2.超时重传
超时重传是用来处理丢包问题的,主要触发方式有三种:
第一种是发送方的数据丢失:由于发送方的数据未达到接收方,接收方也就不会给发送方返回ACK,(发送方每发送一个数据段,都会启动超时重传计时器,当超时重传计时器归零的时候,就会超时重传),当计时内发送方没有收到ACK,发送方就知道接收方大概率是没有收到数据了,这时候就会重新发送数据。
第二种是ACK丢失:接收方发送的ACK没有正常到达发送方,发送方就没有收到ACK,等计时器归零的时候会重新发送数据,当接收方收到相同的数据的时候,会进行去重(通过序列号来确认是否重复)并且知道了发送方没有收到ACK,会重新发送ACK。
第三种就是网络延迟过大:数据到达对面的时间大于计时器的时间,此时也会触发超时重传。
3.连接管理
详图:
三次/(四次)握手:
目的:确认双方的通信能力是否正常,同步初始序列号。
四次握手:
第一次握手:客户端向服务器发送SYN=1,ACK=0的报文,用来请求连接
第二次握手:服务器发送SYN=0,ACK=1的报文,用来回应收到了SYN
第三次握手:服务器发送SYN=1,ACK=0的报文,用来告知客户端:服务器的初始序列号
第四次握手:客户端向服务器发送SYN=0,ACK=1的报文,完成双向确认
三次握手:
将四次握手中的第二次握手和第三次握手合并在一起发送,也是目前主流的握手方式。可以减少资源的浪费
为什么不是二次握手呢?
二次握手无法确保通信双方的通信能力是否正常,无法确保连接是双向可达的。
四次挥手:
TCP关闭连接的标准流程
目的:终止双方的连接,确保所有数据已经发送完毕。
第一次挥手:客户端向服务器发送FIN=1的数据报,告诉服务器说以及没有要发送的数据了,请求关闭连接
第二次挥手:服务器向客户端发送ACK=1的数据报,告诉客户端说收到请求
第三次挥手:服务器向客户端发送FIN=1的数据报,告诉客户端说以及没有要发送的数据了,请求关闭连接
第四次挥手:客户端向服务器发送ACK=1的数据报,告诉服务区说收到请求
为什么需要四次挥手,而不是三次?
因为当客服端向服务器发送FIN=1的数据报的时候会关闭客户端向服务器方向的连接(不影响客户端发送ACK=1的报文),此时服务器向客户端发送的数据不一定发送完毕了,这时候服务器会向客户端先发送ACK=1的报文,用来回复收到,此时仍可向客户端继续发送数据,当全部的数据发送完毕之后,服务器会向客户端发送FIN=1的报文,这时候会关闭服务器到客户端的连接,收到客户端发送的ACK=1的报文的时候,挥手结束,关闭连接
只有服务器调用socket.close()方法之后,才会发送FIN报文,这是需要时间的
在挥手过程中,数据丢失了怎么办?
第一次挥手丢失:此时服务器没有收到报文,不会回复ACK=1的报文,客户端触发超时重传机制
第二次挥手丢失:服务器的ACK报文丢失,客户端没有收到ACK报文,触发超时重传机制
第三次挥手丢失:服务器收不到来自客户端的ACK报文,触发服务器的超时重传
第四次挥手丢失:客户端发送ACK报文之后,会有一段时间可以接收到服务器的消息,此时因为服务器没有收到ACK报文,会重新发送,客户端收到新的FIN报文的时候,重新发送ACK报
4.滑动窗口
滑动窗口决定了发送方在未收到接收方的ACK的情况下,最多可以连续发送多少数据。像是接收方和发送方之间有一个数据缓冲区,用字节来衡量。
目的:实现可靠传输和实现流量控制,避免发送方的发送速度超过了接收方的缓存区数据大小导致缓存区数据溢出。
滑动窗口可以让发送方无需每发送一个数据就需要接收一个ACK报文,在窗口大小允许的范围呢,可以连续发送数据。当接收到ACK报文时,滑动窗口向右移动,移动的距离等于接收方已经确认的数据长度。
滑动窗口大小:
滑动窗口大小由接收方根据自身缓存区的空余空间大小决定,发送方会将自身缓存区的空余空间大小通过16位窗口大小字段发送给发送方,这样发送方就可以知道自己的滑动窗口大小应该有多大。
除了上述原因,窗口大小还会被拥塞窗口控制,以下会详讲。
滑动窗口去上述两个原因的最小窗口值。
零窗口:
当16位窗口大小回应为0的时候,发送方不会继续发送数据,那么如何再次向接收方发送数据呢?
当发送方收到 0 窗口的时候,不会继续发送数据,单数会启动一个零窗口探查计时器,定期发送窗口探查报文来确认接收方的缓存区空闲空间大小,目的是为了让接收方通告窗口空间大小。
5.流量控制
TCP 流量控制是为了防止发送方发送数据的速度过快,导致接收方因缓存区不足而无法处理,核心是基于接收方的缓存区的状态动态控制发送方的发送窗口
6.拥塞控制
拥塞控制是TCP协议针对网络拥塞的一个机制,通过动态调整发送方的拥塞窗口,控制发送速率,避免网络过载,最大化的利用网络宽带
流量控制和拥塞控制的区别
拥塞窗口的变化规律:
初始情况下是一个非常小的窗口,此时还不知道是否会拥堵,
接下来会呈指数增长,每个轮次下拥塞窗口都会翻数倍(不丢包的情况下)
当增长到一定程度,就会触发丢包,丢包之后,就会把窗口缩小
1.老式方案:
回到慢增长状态,重新进行如上操作
2.新式方案:
找到阈值(丢包窗口的一半大小),在此基础上进行指数增长(慢速增长),重复操作
7.延时应答
延时应答的目的是减少ACK报文的数量,从而优化传输效率。
延时应答不会无限制延迟ACK,而是会根据TCP协议遵守的严格超时协议来优化传输效果。
当客户端向服务器发送了好几条数据报,服务器的延时应答的延迟到达之后,就会只返回最后收到的那条数据报的ACK,用来告诉客户端说这条数据及其以前的数据我都收到了。
延时应答和立即应答对比:
8.捎带应答
服务器向客户端发送数据报文的时候,会捎带上已接收数据的确认信息附在数据报文的TCP头部中,不再单独发一条ACK。
目的是:减少网络中报文的数量,从而减少网络资源的消耗
9.面向字节流
核心:
1.数据无边界
应用层向TCP发送的数据会被TCP当成一连串的字节。
2.字节序号标识
TCP为字节流中的每一个字节分配了唯一的序号。
3.按需拆分与合并
- 发送方:根据最大报文段长度,窗口大小等因素,将字节流拆分为多个 TCP 数据段发送
- 接收方:将收到的多个数据段按序号重组为完整的字节流,再交付给应用层,屏蔽了底层拆分的细节。
10.异常情况
TCP在数据传输中可能会遇到很多异常情况,协议通过特定机制保障
1.数据丢失
数据丢失的处理情况就是TCP的超时重传
2.数据重复
接收方通过字节序号来区分重复数据,若收到的字节序号在已经收过的字节序号内,会将重复的数据丢弃
3.数据乱序
接收方按序号排序,将乱序的数据暂存于接收缓存,当连续序号的数据段完整后才将数据交付给应用层
4.连接中断
若长时间无数据交互,发送方会发送保活数据报文,若连续多次无响应,则判定连接中断
5.接收方缓存溢出
通过16位窗口字段告知发送方,从而控制发送方的发送速率
6.校验和错误
若校验和与头部的校验和不符,则直接丢弃当前报文,等待发送方重传