【学习笔记】TCP 和 UDP 协议

资料来源:一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibiliTCP协议与UDP协议有什么区别?TCP协议是如何保证数据传输的?三次握手、传输确认、四次挥手又是什么?听芝士君简单讲网络4-TCP协议与UDP协议https://www.bilibili.com/video/BV1kV411j7hA?spm_id_from=333.337.search-card.all.click

 TCP和UDP都工作在传输层,目的是在程序之间传输数据。

TCP和UDP的区别是:TCP基于连接,UDP基于非连接。

TCP

三次握手是建立连接的过程。

当客户端向服务端发起连接时,会先发一包连接请求数据,询问能否建立连接。称为SYN包。

如果服务端同意连接,则回复一包SYN+ACK包。

客户端收到之后回复一包ACK包。

连接建立

为什么不是两次握手而是三次握手?三次握手是为了防止已失效的网络报文突然又传到服务器引起错误!

两次握手:服务端发送SYN + ACK 后直接连接:

假如客户端发送了 SYN1 包,由于网络阻塞导致服务端没有接收到,客户端任务建立连接失败,再重发 SYN2 包。结果服务端以为建立了两个连接!导致两端状态不一致。

三次握手,服务端收不到返回的 ACK 包,就认为连接未建立成功。

三次握手,为了解决网络信道不可靠的问题。

TCP协议需要在不可靠的信道上建立可靠的连接。

如何处理丢包问题、乱序问题?

TCP协议为每一个连接建立了一个发送缓冲区,从建立链接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1。发送数据时,从发送缓冲区取一部分数据组成发送报文,在其TCP协议头中会附带序列号和长度。接收端在收到数据后,需要回复确认报文。确认报文中的 ACK 等于接收序列号+长度,也就是下一包数据需要发送的起始序列号。这样一问一答的发送方式,能够使发送端确认发送的数据已经被对方收到。发送端可以一次发送连续的多包数据,接收端只需要回复一次 ACK 就可以了。这样发送端可以把待发送的数据分割成一系列的碎片,发送到对端,对端根据序列号和长度在接收后重构出来完整的数据。假设其中丢失了某些数据包,在接收端可以要求发送端重传。以上不区分客户端和服务端,TCP 连接是全双工的!

四次挥手:关闭连接

客户端向服务端发送一包 FIN 包,表示要关闭连接,自己进入终止等待 1 状态。

服务端收 FIN 包,发送一包 ACK 包,表示自己进入了关闭等待状态。客户端收到 ACK 包进入终止等待 2 状态。此时服务端还可以发送未发送的数据,客户端也可接收数据。

待服务端发送完数据后,发送一包 FIN 包,进入最后确认状态。

客户端收到之后回复 ACK 包,进入超时等待状态。经过超时时间后关闭连接。而服务端收到ACK包后立即关闭连接。客户端等待超时时间是为了确保对方已收到 ACK 包。如果服务端没收到 ACK 包会重发 FIN 包。

三次握手:

A:是B吗?我要跟你通信,听得到我说话吗?
B:可以通信,你听得到我说话吗?
A:我也听得到。

四次挥手:

A:困了,在干嘛?
B:在刷视频。
B:你要睡了吗?
A:对,晚安。(等她看到消息安心入睡)

(还是B站大佬人长得帅懂得又多还乐于助人 ~ 哈哈 ~

UDP

发送数据就是简单的把数据包封装一下,然后从网卡发送出去就可以了。数据包之间并没有状态上的联系。

正因为 UDP 这种简单的处理方式,导致他的性能损耗非常少,对于 cpu 、内存资源的占用也远小于 TCP 。但是对于网络传输过程中产生的丢包,UDP 协议并不能保证。所以 UDP 在传输稳定性上要弱于 TCP 。

猜你喜欢

转载自blog.csdn.net/qq_41650023/article/details/124734660