TCP通信的三次握手和四次挥手 TCP(Transmission Control Protocol)
传输控制协议
三次握手
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急) Sequence number(顺序号码) Acknowledge number(确认号码)
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接第一次握手:客户端发送syn包(syn=1),随即产生seq number=1234567的数据包到服务器,并进入SYN_SEND状态,等待服务器确认。服务器由syn=1可知,客户端要求建立连接。【第一次握手发送两个包】
第二次握手:服务器端发送ack(ack=1)和ack number=1234567+1来嗯个包,表示确认受到客户端发来的包,同时又向客户端发送syn包(syn=1)和seq number=2345678两个包到客户端,表示向客户要求建立连接,并且进入SYN_RECV状态。
【第二次握手发送四个包】
第三次握手:客户端发送ack包(ack=1),ack seq number=2345678+1两个包发送给服务器端,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
【第三次握手发送两个包】
一个完整的三次握手也就是 请求---应答---再次确认
TCP为什么非要进行三次连接呢?
自己是这样理解的
1.安全
每次在向对方请求建立连接的时候都会发送一个seq number,回应的时候也会发送一个ack number=seq number+1 这样包就确定是目的主机发的,不存在被换包的情况。
2.防止死索
具体和下面所讲的意思基本相同
在谢希仁的《计算机网络》中是这样说的: 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。在书中同时举了一个例子,如下: “已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”
TCP四次分手
第一次挥手:客户端向服务器端发送FIN包(FIN=1)seq unmber=X
【第一次挥手发送两个包】
第二次挥手:服务端向客户端发送ACK(ACK=1) ack number=X+1
【第二次挥手发送两个包】
第三次挥手:服务端向客户端发送FIN(FIN=1)seq number=Z
【第三次挥手发送两个包】
第四次挥手:客户端向服务端发送ACK(ACK=1),ack number=Z+1
【第四次挥手发送两个包】
为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。