TCP:TCP协议位于传输层,是一种可靠的传输控制层协议。
TCP/IP协议在分层中的位置:
TCP/IP协议通过“三次握手”建立连接,并发送数据,结束后以“四次挥手”的形式终止连接。
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接。报文需要加标识以代表双方何种接收方式以及表示传输的过程,涉及的英文表示:
SYN:同步
seq:序列号
ACK:确认位
ack:确认位的值
一、三次握手过程:
- 客户端(左侧)向服务器端发送数据,需要建立TCP连接;客户端发送报文,并让报文头部包含SYN=1,seq=x(同步=1,序列号=x);
- 服务器端:服务器端LISTEN(监听)到客户端发来的数据,立即向客户端发送确认报文,并让报文头部包含SYN=1,ACK=1(大写的ACK表示确认位,=1表示已确认收到信息),seq=y, ack=x+1;(小写的ack表示确认位的值,ack)
- 客户端:客户端收到服务器端发送的报文,然后同样向服务器端发送一个确认报文,(表示,已收到你的消息),并让报文头部包含ACK=1,seq=x+1(seq=x+1表示客户端两次连续发送过程),ack=y+1;
- 连接建立成功。客户端可以发送数据了。
整个过程中,始于客户端要发送信息,终与服务器端接收信息,然后彼此都不信任对方是否准备好。
因此客户端先打招呼,“我要发送数据给你,你OK吗?"
服务器端:“I‘m OK,你可以发送”
客户端:“好的,那我要发送数据,你准备接收”
服务器端:”进入接收状态“。
建立连接成功。
二、为什么要三次握手而不是二次
答:主要为了防止已失效的连接请求报文段突然又传送到了接收端(服务器),因而产生错误。
举例:如客户端A发出连接请求,但因连接请求报文S1丢失而未收到确认,于是A在重传一次连接请求S2。
后来收到了服务器端B的确认,建立了连接。数据传输完毕后,连接释放。
在这个过程中,A总共发出了两个连接请求报文段,其中第一个丢失,第二个到达了B,但是第一个丢失的报文段只是在某些网络节点长时间滞留了,延误到连接释放以后的某个时间才到达B。
如果只有两次握手,此时B误以为A又发出一次连接请求,于是就向A发出确认报文段,同意建立连接,不采用三次握手,只要B发出确认,就建立新的连接了,此时如果A不理睬B的确认且不发送数据,则B要一直等待A发送数据,浪费资源。
二、四次挥手过程
- Client端发起中断连接请求,也就是发送FIN报文。意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。
- Server端接到FIN报文后,发送ACK,告诉Client端,“你的请求我收到了,但是我还没准备好,请继续你等我的消息"。
- 这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。
- 当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client端,”好了,我这边数据发完了,准备好关闭连接了"。
- Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传
- Server端收到ACK后,就知道可以断开连接了。
- Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!