美文网首页
TCP三次握手和四次挥手详解

TCP三次握手和四次挥手详解

作者: 冰棍儿好烫嘴 | 来源:发表于2020-07-22 17:30 被阅读0次

涉及到的字段:

1. 序列号seq

占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号。

2. 确认号ack

占4个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此挡墙报文段最后一个字节的编号+1即是确认号。ack=上次发送的seq+1

3. 确认ACK

占1个比特位,TCP协议规定,只有ACK=1时有效,也规定建立连接后发送的所有报文的ACK必须为1。所以仅当ACK=1,确认号字段才有效。ACK=0,确认号无效。

4. 同步SYN

连接建立时用于同步序号。当SYN=1,ACK=0表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使用SYN=1,ACK=1.因此,SYN=1表示这是一个连接请求,或连接接收报文,SYN这个标志位只有在TCP建立连接才会被置为1,握手完成后SYN标志位被置为0.

5. 终止FIN

用来释放一个

三次握手过程

第一次:

建立连接时,客户端发送SYN包到服务器,其中包含客户端的初始序号seq=x,并进入SYN_SENT状态,等待服务器确认。(其中,SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x)。

第二次:

服务器收到请求后,必须确认客户的数据包。同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含服务端的初始序号seq(服务器)=y,以及服务器对客户端初始序号的确认号ack(服务器)=seq(客户端)+1=x+1)。

第三次:

客户端收到服务器的SYN+ACK包,向服务器发送一个序列号(seq=x+1),确认号为ack(客户端)=y+1,此包发送完毕,客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手。


4.关于第三次挥手

为什么需要三次握手,两次不可以吗?或者四次、五次可以吗?

 我们来分析一种特殊情况,假设客户端请求建立连接,发给服务器SYN包等待服务器确认,服务器收到确认后,如果是两次握手,假设服务器给客户端在第二次握手时发送数据,数据从服务器发出,服务器认为连接已经建立,但在发送数据的过程中数据丢失,客户端认为连接没有建立,会进行重传。假设每次发送的数据一直在丢失,客户端一直SYN,服务器就会产生多个无效连接,占用资源,这个时候服务器可能会挂掉。这个现象就是我们听过的“SYN的洪水攻击”。 总结:第三次握手是为了防止:如果客户端迟迟没有收到服务器返回确认报文,这时会放弃连接,重新启动一条连接请求,但问题是:服务器不知道客户端没有收到,所以他会收到两个连接,浪费连接开销。如果每次都是这样,就会浪费多个连接开销。 

5.个人理解

三次握手可以理解为客户端找服务端说咱俩出去玩儿吧,然后服务端说好啊,我这边做好准备了,可以出去玩儿了,你准备好了么?客户端说我准备好了。完成三次握手,然后就可以一起出去愉快的玩耍了。

四次挥手:

第一次:

首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u。

第二次:

服务器收到这个FIN,它发送一个ACK,确认ack为收到的序号加一。

第三次:

关闭服务器到客户端的连接,发送一个FIN给客户端

第四次:

客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

四次挥手的个人理解

客户端对服务端说咱们分手吧。服务端先确认一下是谁要和他分手(脚踏多只船)然后说你说分咱就分,客户端说既然你同意了那就分手,以后咱们没关系了。

相关文章

网友评论

      本文标题:TCP三次握手和四次挥手详解

      本文链接:https://www.haomeiwen.com/subject/mccryqtx.html