前端系统学习-TCP与UDP
-
为什么tcp需要三次握手
客户端和服务端都需要知道各自可收发。 -
tcp三次握手
客户端:closed ,服务端:listen -
第一次握手:建立连接时,客户端发送SYN(a)包到服务器,并等待服务器确认;
客户端:SYN_Send ,服务端:listen -
第二次握手:服务器收到SYN(syn=a)包,发送已确认客户syn包的应答ACK(a+1)包与自己的一个SYN包(b);
客户端:SYN_Send ,服务端: SYN_REVD -
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(b+1)。
客户端:establised ,服务端:SYN_REVD -
服务器收到 ACK 报文,双方建立链接。
客户端:establised ,服务端:establised -
TCP四次挥手
客户端:establised ,服务端:establised -
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个***。
客户端:CLOSED_WAIT1 ,服务端:establised -
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的***值 + 1 作为 ACK 报文的***值,表明已经收到客户端的报文了。
客户端:CLOSED_WAIT1 ,服务端: CLOSE_WAIT2 -
第三次挥手:服务端发给 FIN 报文,且指定一个***。
*客户端:establised ,服务端:LAST_ACK * -
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的***值 + 1 作为自己 ACK 报文的***值。
*客户端:TIME_WAIT ,服务端:LAST_ACK * -
服务端收到 ACK 报文。
客户端:CLOSED,服务端:CLOSED -
为什么需要设立TIME_WAIT状态而不是直接CLOSED
查看是否继续收到服务端第三次挥手重传的FIN报文,如果收到,则表明服务端没有收到第四次挥手时客户端发送的ACK报文。客户端就可以进行重传ACK报文。 -
TCP和UDP的区别
- TCP是面向连接(三次握手)的,UDP不需要建立链接(直接开干)。
- TCP更可靠(适合大数据量的交换,防止丢失的数据太多),UDP不可靠。
- TCP面向字节流,UDP面向报文。
- TCP1对1,UDP无限制。
- TCP首部为20字节,UDP只有8个(简单结构,闷头开干)。