网络通信原理之TCP,UDP,QUIC

此篇讲述下计算机网络体系结构及网络通信模型、TPC/IP协议、UDP 和 QUIC。

我们所有的工作生活都离不开网络,那么什么是网络呢?

计算机网络:通过通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。

看了定义之后应该就能理解,就是通过网线,卫星基站等将各个电脑等设备连接起来,构成互联网,实现文件共享和信息传递的功能的系统。

计算机网络体系结构

OSI参考模型与TCP/IP模型

OSI:open system interconnection(开放互连系统参考模型),是对各种协议提供标准化的一种框架模型,它给出了7层的理论模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

根据该模型演绎出TCP/IP模型,这是我们真实使用的,将OSI模型中的上3层抽为一层,如下图:

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

这些模型不管怎么实现,都是下一层为上一层提供服务的,也有跨级实现的。

TCP/IP协议簇 : Transmission Control Protocol/Internet Protocol 的简写,中译名为传输控制协议/因特网互联协议,是 Internet 最基本的协议,是由TCP协议和IP协议组成的。它其实是个协议家族,由很多个协议组成,并且是在不同的层, 是互联网的基础通信架构。

TCP协议是在传输层的,可通过tcp协议建立可靠的连接,我们很多开发中都是使用的这种协议。

UDP协议也是在传输层,但是建立的不是可靠的连接,直接将数据传输出去就不管了,现实中UDP也常用,比如打电话,电视成像接收,qq等都是。

IP协议是在网络层的,该协议主要存储着源目标和目的目标的信息,以便确定哪两个设备要建立连接。

网络通信传输流程

当我们访问一个网址,或者我们开发的应用在发送数据给另一台服务或者接口时,这些数据是怎么传输的呢?看下图:

如上图所述:应用发送一个hello world,会经过层层封装往下传,在每一层都会添加该层的相关信息,然后通过网卡传输到目标应用,目标应用会将接收到的数据根据对应协议拆解数据,最终得到原始数据。

在传输的过程中,需要确认端口号和ip地址才能进行通信的。

端口号

端口号是用来识别一个系统内不同程序的,存储端口号的内容占16bit,所以最大端口号是 2的16次方=65535,而0-1023的端口号是分配给已有的一些协议服务,作为它们的默认端口号,这些端口号被称为知名端口号,比如:

客户端连接服务器时也是需要端口号的,只不过这个系统会默认分配10000以上的端口号。

只有65535个端口,那是不是意味只有65535个连接?
并不是的,一个连接有5要素:

在连接服务器的时候,协议号,目标IP地址,目标端口号是不变的,变动的是客户端和端口号,ip地址是32b,端口号是16,

所以理论上可以建立的连接是 2的32方+2的16方,当然实际上并不会这样,系统肯定会有限定值的。

同理的,一个客户端也可以连接同样多的服务端,客户端在不指定端口号时,操作系统是可以指派同端口号的。

TCP/IP协议

TCP是可靠的连接协议,通过三次握手建立连接,四次挥手断开连接,还会通过超时重传和应答确认机制来保证数据的完整性。

三次握手建立连接

在建立连接的情况下,主要是为了确认4个状态完好,以A和B建立连接为例说明:

对A方来说,需要确认两个状态:

A具备发送数据的能力

A具备接收数据的能力

对B方来说,需要确认两个状态:

B具备发送数据的能力

B具备接收数据的能力

这4个状态都是通过发送数据来确认的:

还是要说明下:seq_no是建立连接发送的一个非常随意的数字信息,确认应答在此基础上+1,就是为了确保是同一个信息交互。

SYN洪泛攻击

在三次握手建立连接的过程中,是有可能被攻击的,假设我弄个假ip地址发送数据包给服务器,服务器依照客户端给的ip地址发送回应和连接,但是该ip地址是不存在的,所以服务端会一直等待连接,并且操作系统会维护一个连接列表,当有大量这样的连接时,这个连接列表会填满,导致所有的连接都得不到响应,这就是洪泛攻击。下边是连接列表最大限定数。

connect_max

解决方案:

监视无效连接并释放连接

延缓TCB分配方法,在建立第一次握手连接时,服务器会分配一个TCB(连接控制资源),大概要占用200+byte,所以延迟TCB分配,等连接完成了再分配,这样可以减少服务端压力

设置防火墙

建立好连接了,接下来就该传输信息了,传输信息的时候并不是一条一条信息传的,而是会根据大小拆分开来传的,拆分开后会编好序号,传输的过程也并非会万无一失的,这就需要各种机制来保证数据的正确。

应答确认机制:假设A按顺序发送序号1 2 3 4 5 6 7的信息给B,在B方,收到的信息是1 2 4 3 7,B会对收到的信息进行排序,会发现缺失了序号5 6的数据,然后通知A,A收到相应应答后,会重新发送序号5 6的数据。

超时重传机制:当A发送给B数据超过一定阈值时依旧没有收到B的应答,则此时会认为B没有收到数据,A会进行重发。

那么超时时间怎么设定呢?这个会根据网络情况动态调整的,采样统计数据包 从发送回去到接收回来应答数据的这段时间(这段时间称为RTT),通过各种算法来调优RTT,就得出了超时重传时间。

滑动窗口:TCP还可以提供滑动窗口技术来进行流量控制,保证流量不会超过系统响应能力。

全双工:TCP协议是支持全双工的,即客户端传数据包给服务端的同时,服务端也可以传数据包给客户端。

四次挥手断开连接

在传输完数据包后,不使用了得断开,这时就需要四次挥手(也可能三次就行了)断开连接。
此时需要双方都断开连接,单方面的不行,流程如下图:

附上一

可以看到客户端后面会有一个TIME-WAIT状态,这是为了防止马上close导致资源释放,客户端的另一个应用程序用这个端口号来和服务端进行连接,而此时服务端还没关闭连接,还有可能发送数据,这个新的连接可能会接收到数据,就会导致数据混乱。

2MSL一般是2分钟的时间。

当服务器一开始就没有数据传输了,则4次挥手可能只需要3次就行了。

UDP 协议

udp(User Datagram Protocol用户数据报协议)协议是不可靠的,因为不需要对端的应答,我只管发送信息出去就好了,所以这种协议非常适合进行广播操作,因为不需要建立连接,所以速度非常的快,但是容易丢失数据。

基于UDP引入的新的数据传输协议UDT(UDP-based Data Transfer Protocol),udt的主要目的是支持高速广域网上的海量数据传输,典型的栗子就是建立在光纤广域网上的网格计算,如远程访问仪器,高分辨率的多媒体流。

只要是在UDP的基础上,引入了拥塞控制和数据可靠性控制。

特性:

基于udp的应用层协议:同时兼顾tcp协议的安全可靠和udp协议的高效

面向连接的:也就是传输数据包需要连接,这种连接是基于握手、keep-alive以及关闭连接的

可靠的:依靠包序列机制、接收者的ack响应和丢包报告,ack序号,重传机制来实现的

全双工的,与TCP一样

新的拥塞算法:不同于tcp算法的慢启动和拥塞避免,而是混合的,基于窗口和速率的拥塞控制算法

带宽估算:udt使用对包(PP - Packet pair)的机制来估算带宽值,就是对到达的时间进行统计,然后计算出链路的带宽

QUIC协议

该协议也是基于udp的传输层协议,是google对各种协议如http,tcp,udp,TLS等技术进行改进的,希望能够替代tcp,udp协议,因为要该直接改进tcp是非常有难度的,tcp是基于操作系统编写的,这个要修改就很难了。

优势:

采用多路复用思想:一个连接可以承载多个流,同时发送多个请求,而且请求间是独立的,相互间不影响

只需要1RTT的延迟就能建立可靠安全的连接,而TCP+TLS则需要3次RTT的连接,如果有缓存的话,则QUIC可以0个RTT就能建立连接

使用纠错机制:在发送包时,订好规则,每n个包就携带一个校验和包,如果这个n个包中丢了一个包,可以通过校验包和其他包来恢复这个包,不需要进行重传

基于客户端(应用程序)实现的,不像tcp是基于内核的,这样就可以快速迭代

QUIC在客户端保存连接标识,当客户端的ip或者端口变化时,可以通过标识来请求服务器,以达到快速重连的目的

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/126644934