TCP UDP 协议学习

首先网络分为以下几层,TCP/UDP 都工作在传输层。

主要用在程序之间传输数据,数据可以是文本文件、视频、图片等,对于TCP/UDP 来说他们都是一堆二进制数,没有太大的区别,具体的区别就是一个基于连接(TCP),一个基于非连接(UDP)。

 

如果把人与人之间的通信比作是进程与进程之间的通信,则有两种方式,一个是写信,一个是打电话。写信是没有响应的,包括收件人是否收到,地址是否正确这一切都是未知的;但是打电话就可以确定对方是否接通,电话是否正确,这一切都是已知的。TCP和UDP就类似于上述两种情况,详情可以看看下面的图解。图片来自于B站UP主的视频截图。

TCP之所以能够保证上述过程的正确完成,主要有以下三方面:三次握手、传输确认、四次挥手

三次握手:

三次握手是基于连接的过程,当发送数据时,客户端先放松一包请求数据(SYN包),如果服务端同意连接,则回复一个包(SYN+ACK包),客户端收到之后回复一个包(ACK包),连接建立。

 因为上述过程发送了三个数据包,所以被称为三次握手。

为什么不是两次握手而是三次握手?

防止已失效的报文突然又传到服务器引起错误。比如客户端先发了一个SYN包给服务端,由于网络阻塞问题,服务端没有收到这个SYN包,此时客户端又发送了一个SYN包,服务端收到并回复了SYN+ACK包;此时上一个SYN包由于网络恢复,又发送给了服务端,此时服务端以为是两次连接,但是客户端仍然认为是建立的一次连接,造成双方冲突不一致的现象。如果是在三次握手的情况下,服务端收不到最后的ACK包,自然不会认为连接成功。所以三次握手本质上就是为了解决网络信道不可靠的问题,为了能够在不可靠的信道上建立可靠的连接

发送方式:

TCP是在不可靠的网络信道上建立可靠的连接,主要面临以下两个问题,一是丢包问题,一是乱序问题,TCP为了解决这个问题,TCP协议为每一个连接建立了一个发送缓冲区,如下图所示:从建立连接后的第一个序列号为0,以下每次+1,每次发送,从缓冲区取一部份数据组成发送报文,在TCP协议头中附带序列号和长度,确认报文ACK中包含数据的序列号和长度,也就是下一次连接发送的起始序列号。这样的发送方式能够确认发送端发送的数据被接收到,这样也可以连续发送多包数据,接收端只需要回复一次ACK即可。发送端可以把待发送的数据分割成一系列的片段(切割发送),发送到对端,对端根据序列号和长度,重组出来完整的数据。假如其中丢失了一些数据包,接收端可以要求发送端进行重传,比如丢失了100-199这100个字节的数据,接收端向发送端发送ACK=100的报文,发送端收到后重传这一包的数据,接收端进行补齐。

注意以上过程不区分客户端和服务端,因为TCP是全双工的,对于两端来说均采用上述机制。

四次挥手:

服务端和客户端均可以主动发起关闭连接请求。

比如客户端主动发送关闭连接请求,过程如图,具体解释如下:

  • 客户端发送 FIN 包,然后进入等待1状态(WAIT-1),等待服务端发送的ACK包。
  • 服务端收到FIN包,发送ACK包后进入关闭等待状态(CLOSE-WAIT),客户端进入终止等待2状态。服务端此时还可以发送未发送的数据,客户端也还可以接收数据。
  • 服务端发送完数据之后,向客户端发送一个FIN包,进入最后确认状态。
  • 客户端收到之后回复ACK包,进入超时等待状态,经过超时时候后关闭连接。服务端收到ACK包后立马关闭连接。

为什么客户端需要等待超时时间?

为了保证对方已收到ACK包,如果客户端在发送完ACK包之后立马释放了连接,但由于网络问题,服务端并没有收到ACK包,服务端将一直停留在最后确认状态。如果服务端没有收到ACK包,客户端等待一段时间,这时服务端会重发FIN包,客户端响应这个FIN包重新发送ACK包,并刷新超时时间。这个机制和三次握手一样,都是为了在不可靠的网络连接过程中,进行可靠的断开连接确认。

UDP

UDP连接时基于非连接的,发送数据就是简单的把数据包封装以下,然后从网卡发送出去,数据包之间没有状态上的联系。速度较快,但是可能存在丢包问题。

TCP和UDP的主要区别 

TCP适用于对数据稳定性要求高的场景,而UDP则适用于要求速度快,对数据完整性要求不高的场景 。

猜你喜欢

转载自blog.csdn.net/m0_46259216/article/details/127624748