TCP协议
TCP和UDP
TCP/IP协议中两个具有代表性的协议是,TCP和UDP。
- TCP协议是面向连接的,可靠的流协议。
- UDP协议是不可靠的数据报协议。UDP不能保证消息一定到达。
- TCP用于需要保证可靠传输的情况下,UDP主要用于对高速传输和实时性有较高要求的通信和广播通信
TCP连接–三次握手
- TCP提供面向有连接的通信传输。面向连接是指在数据通信开始前做好两端之间的连接工作。
- 三次握手是指建立一个TCP连接时需要客户端和服务器端总共发送三个包以确认连接的建立。
三次握手的流程图:
- 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器确认。
- 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志为SYN和ACK都置为1,ack=J+1,随机产生一个seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
- 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确就将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端和服务器端之间可以开始传输数据了。
TCP断开连接–四次挥手
-
四次挥手即终止TCP连接,断开一个TCP连接需要客户端和服务器端共发送四个包以确认连接断开。
-
由于TCP连接是全双工的,因此,每个方向都必须单独进行关闭。当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动,即不会再收到数据了,但是这个TCP连接仍然能够发送数据,知道另一方向也发送FIN,连接才会断开。
-
第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说,客户端没有数据要发送了,如果服务器端还有数据没有发送完成,连接不关闭,可以继续发送。
-
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续等待消息。客户端进入FIN_WAIT_2状态,继续等待服务器端的FIN报文。
-
第三次挥手:当服务器端确定数据发送完成,则向客户端发送FIN=N的报文,告诉客户端数据发送完成,可以关闭连接。服务器端进入LAST_ACK状态。
-
第四次挥手:客户端收到FIN=N的报文后,就知道可以关闭连接了,向服务器端发送ACK=1,ack=N+1的报文。服务器收到报文后,正式断开连接。