画出TCP三次握手和四次挥手的示意图,并且总结TCP和UDP的区别:
1、udp是无连接的,tcp是面向连接的;
2、udp是不可靠传输,tcp是可靠传输;
3、udp是面向报文传输,tcp是面向字节流传输
udp不可靠,tcp可靠
1:TCP连接过程(三次握手)
第一次握手
客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT 状态。
第二次握手
服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。
第三次握手
当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。
第一次挥手:
客户端向服务器发送一个 FIN 数据包(FIN = 1,seq = u)主动断开连接,报文中会指定一个序列号。
告诉服务器:我要跟你断开连接了,不会再给你发数据了;
客户端此时还是可以接收数据的,如果一直没有收到被动连接方的确认包,则可以重新发送这个包。
此时客户端处于 FIN_WAIT1 状态。
第二次挥手:
服务器收到 FIN 数据包之后,向客户端发送确认包(ACK = 1,ack = u + 1),把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了
这是服务器在告诉客户端:我知道你要断开了,但是我还有数据没有发送完,等发送完了所有的数据就进行第三次挥手
此时服务端处于 CLOSE_WAIT 状态,客户端处于 FIN_WAIT2 状态
第三次挥手:
服务器向客户端发送FIN 数据包(FIN=1,seq = w),且指定一个序列号,以及确认包(ACK = 1, ack = u + 1),用来停止向客户端发送数据
这个动作是告诉客户端:我的数据也发送完了,不再给你发数据了
此时服务端处于LAST_ACK状态,客户端处于TIME_WAIT状态
第四次挥手:
客户端收到 FIN数据包 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值
此时客户端处于 TIME_WAIT 状态。
需要过一了一定时间(2MSL)之后,客户端发送确认包(ACK = 1, ack = w + 1),此时客户端才会进入 CLOSED 状态,以确保发送方的ACK可以到达接收方,防止已失效连接请求报文段出现在此连接中。
至此,完成四次挥手。