- TCP为传输控制层协议,为面向连接、可靠的、点到点的通信;
- UDP为用户数据报协议,非连接的不可靠的点到多点的通信;
- TCP侧重可靠传输,UDP侧重快速传输。
TCP三次握手
(1)第一次握手:Client 标志SYN=1(标识建立连接),随机一个数值J赋值给seq(seq=J),并将数据包发送个Server,Client进入SYN_SENT。
(2)第二次握手:Server接受数据包通过SYN=1知道Client要建立连接请求,Server将SYN、ACK都置1,ack=J+1(Client生成的随机数),随机生成数值K,seq=K,并将数据包发送给Client,Server进入SYN_RCVD。
(3)第三次握手:Client接收到数据包,检查ack=J+1 并且 ACK=1,如果正确则标记ACK=1,ack=K+1(Server生成的随机数)并发送给Server,然后Server检查ack=K+1且ACK=1,此时Client和Server进入ESTABLISHED状态,完成三次握手。
TCP四次挥手 (Server和Client都可发起关闭,以Client为例)
- 第一次挥手:Client发送FIN(=M)用来关闭Client到Server的数据传送,Client进入泥土FIN_WAIT状态
- 第二次挥手:Server收到FIN后,发送ACK到Client, 确认序号+1 (ack = M+1),Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送FIN (=N),用来关闭Server到Client的数据传送,Server 进入LAST_ACK状态。
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,确认序号+1(ack = N+1),Server接收到后进入 CLOSED状态,完成四次挥手。
TCP为什么要三次握手
防止已失效链接请求 又发送到服务器而产生升错误
举例:Client发送一个链接请求在服务器滞留了,然后Client进入closed状态,此时Server认为Client想要建立链接,于是发送报文,但是Client已经Closed,收到的报文都会丢弃,如果是两次握手的话现在两者已经建立连接了,服务端一直等待Client的消息,而Client已经关闭了。
TCP为什么要四次挥手
关闭链接时,服务端收到客户端发送的FIN时,仅仅表示对方不再发送数据了,但是还能接受数据,这时候的服务端还是能继续发送数据的,而且服务端也有可能还有未发送完的数据,在这个阶段还是可以继续发送的。等完成后,服务端发送FIN给客户端表示同意关闭链接。