TCP---三次握手,四次挥手过程理解

  • 时间:
  • 来源:互联网
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Black_KB/article/details/103300770

1.TCP简介:

  • 传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
  • 是一种面向连接的、可靠的、基于字节流的传输层通信协议。

2.TCP的特点:

  • 1.面向连接:
    • 通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。
  • 2.可靠传输:
    • TCP 采用发送应答机制
    • 超时重传
    • 错误校验
    • 流量控制和阻塞管理

3.TCP报文首部

1.源端口和目的端口,各占2个字节,分别写入源端口和目的端口;
2.序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
3.确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;
4.保留,占6位,保留今后使用,但目前应都位0;
5.确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
6.推送PSH,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
7.复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
8.同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
9.终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;

4.三次握手:

  • TCP建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP报文段。
    在这里插入图片描述
  • 解释过程:
    • 一开始,客户端和服务器都处于关闭状态,客户端A主动打开请求连接,而服务器B在没有接受到连接请求之前,被动打开并且监听请求。
    • 第一次握手: 此时的客户端A开始第一次请求连接,并且携带着SYN=1,seq=x。此时的客户端A进入进入SYN-SENT(同步已发送)状态。SYN是TCP首部的同步位,用于同步序号。SYN=1表示这个请求是连接请求或者连接接受请求。seq是一个序列号,由于当TCP传输时,是基于字节流的传输,所以TCP会给每个数据字节编上序号,第一个字节的序号由本地随机产生。当数据字节都有序号之后,就会给每个报文段一个序号。seq序列号就是这个报文段的第一个字节的序号。
    • 第二次握手: 当服务器B接收到客户端A的请求时,给客户端A发送SYN=1,ACK=1,seq=y,ack=x+1,此时服务器B进入SYN-RCVD(同步已接收)状态。ACK是确认,一般置1,若置0,则代表报文无效。ack代表是确认号,ack=x+1,是期望收到对方下一个报文段的第一个数据字节的序号,是对客户端发来的seq进行加1。seq=y,是服务端自己生成的序列号。由于SYN不携带报文数据,所以会消耗一个序号。
    • 第三次握手: 当客户端接收到服务器发送的数据,需要进行确认。此时客户端会查看ACK是否为1,ack是否是自己发送x+1。若都正确,则会把服务端发来的y+1,然后放入ack中,把x+1放入seq中,因为这是服务器期望的报文段的第一个数据字节的序号。发送ACK=1,seq=x+1,ack=y+1之后,客户端进入ESTAB-LISHED(已经建立连接)状态,当服务端接收到确认之后,也进入ESTAB-LISHED(已经建立连接)状态。此时ACK可以携带报文数据,不携带数据不消耗序号。

5.四次挥手:

在这里插入图片描述

  • 第一次挥手: 此时的客户端A和服务端B都是ESTAB-LISHED(已经连接状态),此时的客户端A主动关闭连接,向服务器B发送了一个FIN=1,seq=u,此时客户端进入FIN-WAIT-1(结束等待1)状态。FIN是终止连接,当FIN=1是,表示发送方的数据都已经发送完毕,请求释放连接。FIN不携带报文数据,但是要消耗一个序号。
  • 第二次挥手: 服务端B接收到请求后,向客户端A发送确认,ACK=1,seq=v,ack=u+1,服务端进入CLOSE-WAIT(关闭等待状态)。ack=u+1是对客户端的seq=u的确认。客户端A接收到服务端的请求后,进入FIN-WAIT-2(结束等待2)状态。等待服务端B其他数据的传送。
  • 第三次挥手: 若服务端B没有可发送的数据,那么就发送FIN=1,ACK=1,seq=w,ack=u+1,进入LAST-ACK(最后确认状态),这时B需要重复发送确认ACK=1。
  • 第四次挥手: 客户端A接收到请求之后,发送确认报文,ACK=1,seq=u+1,ack=w+1,此时客户端A进入TIME-WAIT(等待状态),此时并不是马上断开TCP连接,而是必须经过时间等待计时器设置的时间2MSL后,客户端A才能进入CLOSE (关闭状态)。MSL(maximum segment lifetime)是最长报文段寿命。

6.这些仅仅是TCP连接和断开过程,没有深入到底层研究,以下问题有待今后解决。

  • 比如为什么是三次握手不是二次握手?
  • 为什么必须是四次挥手?
  • 为什么客户端不是直接断开而需要等待2MSL?

本文链接http://element-ui.cn/news/show-410.aspx