TCP三次握手用于客户端和服务端建立连接的过程。
首先客户端向服务端发送标识位SYN=1,以及一个随机的序号seq= x。发送完后,客户端进入SYN—SEND状态,也就是同步已发送状态。
服务器接收到客户端的数据包后,向客户端发送标识位SYN = 1,ACK = 1,以及随机序号seq = y,确认号ack = x + 1;发送完后服务端进入SYN_RCVD状态,也就是同步已接受状态。
客户端接收到服务器的反馈之后,再向服务器发送标识位ACK = 1,以及确认号ack = y + 1。服务端再检查标识位ACK是否为1,确认号ack是否为y+1。如果两者都相等,那么代表连接建立完毕。客户端和服务端都进入ESTABLISHED状态,也就是连接已建立状态。
为什么要三次握手的原因:我们假设client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。
假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。
所以,采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。
然后就是TCP是需要全双工的,也就是客户端和服务端都需要能够发送和接收消息。
例子:
A向B发消息表白
B收到后,也发了个消息,说同意
A接着又发了个消息说那我们现在是对象了
TCP四次挥手:
TCP四次挥手用于客户端和服务端断开连接的过程。
客户端和服务端都能主动的请求释放连接。这里以客户端主动请求释放连接为例子。
首先客户端向服务端发送一个标志位FIN = 1,一个序号seq = u。发完后,进入FIN_WITE_1状态。
然后服务端接收到后向客户端发送一个标识位ACK = 1,以及确认号ack = u + 1,序号seq = v;发完后进入CLOSE_WAIT状态。
然后服务端再向客户端发送以标识位FIN = 1,ACK = 1以及确认号ack = u + 1,序号seq = w;发完后进入LASK_ACK状态
最后客户端向服务端发送标识位ACK = 1,确认好ack = w + 1,序号u + 1。发完后进入CLOSED状态,服务器端接收后也进入CLOSED状态。
为什么是四次握手:因为客户端向服务端发起断开请求时,只是表明客户端没有数据要发给服务端了。而服务端可能还有数据要发给客户端,因此服务端接收到客户端的请求后发送了确认,然后需要接着向客户端传输数据,当服务端数据也传输完成了之后,便回向客户端说明自己数据也已经发送完了,之后客户端收到消息,才会发出最后的断开通知。
例子:
A向B发消息提出分手,说不爱他了
B收到A消息,反过来问A为什么
A没有回答B,过一段时间B也不爱A了,于是B给A发消息说同意分手
A收到B的同意后,发了个分手快乐。