TCP(Transmission Control Protocol)协议是一种面向连接的、相对可靠的传输控制协议(虽说是面向连接,其实也就是通信双方保持一个‘连接’状态)
三次握手和四次挥手是TCP协议中比较重要的部分,它们都是为数据传输而服务的,一个是在数据传输开始之前建立连接,一个是在数据传输结束之后关闭连接,接下来就简单说一下这个过程:
关于各种状态以及发送的报文信息,上图已经表现的很清楚,就不详述了
三次握手
必须是client先发起请求
- Client向Server发起建立请求信息,“我想给你发数据,可以吗?”
(此步是为了让Server端知道Client能够发送数据) - Server端确认Client发来的请求信息,同时向Client返回确认信息,“可以,你什么时候发?”
(此步是为了让Client知道Server既能接收到数据也能发送数据) - Client收到Server的确认信息,并向Server发送确认信息,“我现在就发,你接着吧!”
(此步是为了让Server知道Client能够接收数据)
经过上面的三次握手,会让Client和Server确认彼此双方既能接收数据又能发送数据,然后便可以进入数据传输进程了,一般来说,握手次数达到3就可以保证通信信息被正确传达。
四次挥手
谁先发起请求都可以
因为Client和Server都能发起请求,所以我们此处用A和B替代通讯双方
- A发起请求结束信号(A表示自己不会再传输数据了,请求断开)
- B向A发送确认收到A发起的结束请求的确认信号(B知道了A的请求,但是还有数据要处理,暂时还不能断开)
- B向A发送请求结束信号(数据发送完成,B同意断开)
- A向B发送确认结束信号(A同意断开,很愉快的中断这次TCP连接)
由于TCP是全双工的协议,也就是说两端可以同时进行数据传输,所以,TCP连接的关闭在两端都关闭之后才正式关闭。
相关疑问点:
-
建立连接的第二次握手为什么要传回SYN?
接收端传回发送端所发送的SYN是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。 -
传了SYN,为啥还要传ACK?
双方通信无误必须是两者互相发送信息都无误。传了SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要ACK信号来进行验证。 -
为什么要三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,导致服务器端的一直等待而浪费资源。
引用书中一个例子:
“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”