计网复习—三次握手和四次挥手

三次握手

计网复习—三次握手和四次挥手_第1张图片
三次握手其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接受能力发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。
刚开始客户端处于Closed的状态,服务端处于Listen状态。进行三次握手:

  • 第一次握手: 客户端给服务端发一个SYN报文,这时首部中的同部位SYN = 1, 同时选择一个初始序号seq = x 。TCP规定,SYN报文段(即SYN = 1的报文段)不能携带数据,但要消耗一个序号。这时TCP客户进程进入SYN-SENT(同步发送)状态。
  • 第二次握手: 服务器收到客户端的SYN报文之后,会以自己的SYN报文作为应答,服务端在确认报文段中应把SYN位和ACK位都置1,确认号是ack = x + 1,同时也为自己选择一个初始序号 seq = y 。这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。
  • 第三次握手: TCP客户进程在收到服务端的确认后还要向服务端做出确认。确认报文段的ACK置为1,确认号ack = y + 1,而自己的序号seq = x + 1(初始为seq = x,所以第二个报文段要+1)。ACK报文段可以携带数据,不携带数据则不消耗序号。这时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。当服务端收到客户端的确认后,也进入ESTABLISHED状态。

问题思考:

三次握手的作用是什么?

  • 第一次握手:客户端发送网络包,服务端收到了。
    这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
  • 第二次握手:服务端发包,客户端收到了。
    这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接受能力是否正常。
  • 第三次握手:客户端发包,服务端收到了。
    这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
    三次握手过程中可以携带数据吗?
    其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据
    为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。
    也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。

四次挥手

计网复习—三次握手和四次挥手_第2张图片
建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。
刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下:

  • 第一次挥手: 客户端进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。 客户端 把连接释放的报文段首部的终止控制位FIN置1,其序号seq = u,它等于前面已传送过的数据的最后一个字节的序号加1。这时 客户端 进入FIN-WAIT-1(终止等待1)状态,等待 服务器 的确认。请注意,TCP规定,FIN报文段即使不携带数据,它也消耗掉一个序号。
  • 第二次挥手: 服务器 收到连接释放报文段后即发出确认,确认号是 ack = u + 1,而这个报文段自己的序号是v,等于 客户端前面已经传送过的数据的最后一个字节的序号加1。然后 服务器就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应该通知高层应用进程,因而从 客户端服务器这个方向的连接就释放了。这时TCP连接处于半关闭状态,即 客户端已经没有数据要发送了,但服务器若发送数据, 客户端仍要接收。也就是说,从服务器客户端这个方向的连接并未关闭,这个状态可能会持续一段时间。
    客户端收到来自服务器的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待服务器发出的连接释放报文段。
  • 第三次挥手:服务器 已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时 服务器 发出的连接释放报文段必须使 FIN = 1。现假定服务器的序号为w,(在半关闭状态服务器可能有发送了一些数据)。服务器必须重复上次已经发送过的确认号 ack = u + 1。这时 服务器 就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  • 第四次挥手: 客户端在收到b的连接·释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack = w + 1,而自己的序号是seq = u + 1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号)。然后进入到TIME-WAIT(时间等待)状态。请注意,现在TCP连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置时间2MSL后,客户端才进入到CLOSED状态。
    时间MSL叫做最长报文段寿命。

你可能感兴趣的:(计网,网络,http,网络协议)