TCP和UDP

179 阅读4分钟

下面我来简单谈谈我对tcp和udp的理解

区别

首先TCP/UDP都属于传输层,TCP是基于链接的,UDP基于无连接的,所以数据传输方面TCP比UDP可靠,效率方面UDP比TCP高,资源消耗方面UDP比TCP低。如果把数据之间的传输比做人与人之间的沟通,TCP就相当于打电话,能可靠的把信息表达清楚并确保对方能听得到,UDP就好比是写信,把要说的话和地址写上去,直接发出,而是否到达对方的手中、信的内容是否有误是没有办法确认的。

TCP

了解TCP就要了解TCP的三次握手,传输确认和四次挥手

三次握手

三次握手是建立连接的过程,首先客户端向服务端发送连接请求数据,询问能否与之建立连接,这个数据我们称为syn包,如果服务器同意,就会回复syn+ack包,表示同意,客户端收到后回复ack包确认,链接建立。过程中发送了3包数据,所以称之为三次握手。 image.png

思考:为什么是3次不是两次?
模拟两次握手:客户端发送了syn包1请求连接,因为网络或其他原因,这个包并没有到达服务器,于是客户端重发syn包2,syn包2顺利到达服务器,服务器也正常返回了syn+ack包,建立了连接,此时syn包1又顺利到达了服务器,这时服务端会认为客户端又发送了新的连接请求。此时服务端认为是两个连接,而客户端认为是一个连接,存在分歧。

通俗理解,通过第一第二次握手客户端认为自己可以发送数据也能接收数据,服务器只能确定自己可以接收数据,是否发送成功,服务器是不能确认的,只有通过第三次握手,服务器才能确定自己发送数据也可以被成功接收

传输确认

对于可靠的传输,传输数据时要确认不能有丢包问题和数据乱序问题。 TCP会为每一个连接建立一个发送缓冲区,从第一个字节0,后面逐个加1,发送数据时可以取部分数据内容组成发送报文,在TCP协议头中会附带序列号和长度,接收方收到后会返回确认报文,确认报文的ack=序列号+长度=下一包起始序列号,这样的一问一答的方式,可以确保接收方接收到了正确的数据,发送方也可以一次发送多包数据。如果中间丢失了某个包,接收端可以发送前一次的ack值即要求发送方重新传包

四次挥手

image.png 四次挥手是连接关闭过程,假设客户端发起连接关闭请求,此时客户端就会向服务端发送fin包,这是第一次挥手,服务端收到后回复ack包表示自己进入关闭等待状态,这是第二次挥手,此时服务端还可以发送未发送的数据,客户端也可以接收数据,待服务端发送完数据后,发送fin包进入最后确认状态,这是第三次挥手。客户端收到后回复ack包,并经过一段超时连接确认服务端没有再次发送信息后关闭连接,而服务端收到ack包后立即关闭连接,这时第四次挥手。

为什么最后一次客户端发送ack包后要等待一段时间?
因为如果客户端立刻关闭连接,如果ack包没有到达服务端,服务端就会一直处于最后确认状态,如果客户端等待了一段时间,服务端发现没有收到ack包会重发fin包。随后客户端会重发ack包。

通俗理解,客户端发送完请求后告诉服务端“请求结束,要求关闭连接”,此时服务端可能在处理请求,但是要先回复“我知道了”,等处理好后再告诉客户端“我处理结束也可以关闭连接”,客户端收到服务端信息后回复“好的”。其实与三次握手一样,只是中间服务器多发送了一次而已

注意:TCP是全双工的,全双工允许数据在两个方向上同时传输,上述演示的都是客户端向服务器传输,事实上可以反向甚至是服务器向服务器传输

UDP

UDP就是简单的把数据包封装一下,然后发出去,数据包之间没有状态的联系,正因为这种简单的处理方式,导致他的性能损耗非常少,内存资源的占用也远小于CPU,但是对于数据的正确性和完整性UDP并不能保证,所以UDP在传输稳定性上要弱于TCP