TCP和UDP原理
TCP原理
TCP建立(三次握手)
- 由主机Client发送建立tcp连接的请求,此时tcp报文会随机生成一个seq号为a(序列号),并把SYN字段置为1,表示需要建立tcp连接。
- 主机Server接受到主机Client发送来的tcp连接请求,也会在回复的tcp报文中随机生成一个序列号为B,SYN字段置为1,ack设置为A+1进行回复,以便Client收到信息时,知晓自己的tcp建立请求已得到了验证
-
主机Client接收到主机Server的发送来的信息后,将自己的seq+1 ,ack设为B+1,并且再次回复ack验证请求,进行回复。
TCP断开(四次握手)
- 由客户端发起tcp断开连接,此时seq为A+1 FIN置为1,表示请求断开连接
- 服务器接受到tcp断开请求后,此时seq为B+1,ack置为A+1+1,表示客户端发起的断开请求我已经接收到了
- 服务器并不会马上断开tcp连接,它需要将数据信息全都传入给客户端后,会把tcp报文的 seq=B+1 FIN置为1 ack置为A+2,此时服务器表示可以断开tcp连接了
-
客户端接受到信息后,会发送一个确认断开的报文,seq置为A+1 ack为B+1+1,确认断开连接
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,“告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,“就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
UDP原理
UDP是无连接的传输协议,主要用于在相对可靠的网络上的数据传输,或用于对延迟较敏感的应用等。
UDP是面向报文的,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。
理解
UDP是是IP协议暴露在传输层上的接口。
UDP的优点:
UDP是无连接的,即发送数据之前不需要建立连接,(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
没有拥塞控制,传输速度快
UDP的缺点:
传输不可靠
总结
- TCP和UDP通过端口号标识上层应用和服务
- TCP通过三次握手建立可靠连接
- TCP通过校验和进行差错校验,通过序列号、确认和超时重传机制实现可靠传输,通过滑动窗口实现流量控制
- UDP实现简单,资源占用少,实用性强,适用于可靠性高的网络和延迟敏感的用用