TCP协议

1. 基本概念

  • 名称
    • 中文全称:传输控制协议
    • 英文全称:Transmission Control Protocol
  • 特点
    • 面向连接的
      1. 双方必须建立连接才可以进行数据的读写
    • 可靠的
    • 基于字节流的

2. 传输过程

2.1 报头

TCP报头

  • 源端口号/目的端口号:表示数据来源进程,目标进程
  • 32位序号--32位确认序号
    • 4位首部长度:表示该tcp报头有多少个4字节(32个bit)
    • 6位保留:留着以后备用
    • 6位标识符
      • URG:标志紧急指针是否有效
      • ACK:标志确认序号是否有效
      • PSH:用来提示接收端程序立刻将数据从tcp缓冲区读走
      • RST:要求重新建立连接,含有RST标志的报文称为复位报文段
      • SYN:请求连接,含有SYN标志的报文称为同步报文段
      • FIN:通知对端,本段将关闭,含有FIN的报文称为结束报文段
    • 16位窗口大小
    • 16位校验和:由发送端填充,校验形式有CRC校验等。校验不通过,则数据有问题。此处的校验包含TCP头和TCP数据部分。
    • 16位紧急指针:用来标识哪部分数据是紧急数据

2.2 进程管理机制

正常的TCP经过三次握手建立连接,四次挥手断开连接

2.2.1 三次握手

  1. 第一次

    客户端 —-> 服务器 此时服务器知道客户端需要建立连接了

  2. 第二次

    客户端 <—- 服务器 此时客户端知道服务器收到连接请求了

  3. 第三次

    客户端 —-> 服务器 此时服务器找到了客户端收到了自己的响应

刚开始, 客户端和服务器都处于 CLOSE 状态. 
此时, 客户端向服务器主动发出连接请求, 服务器被动接受连接请求.

1, TCP服务器进程先创建传输控制块TCB, 时刻准备接受客户端进程的连接请求, 此时服务器就进入了 LISTEN(监听)状态 
2, TCP客户端进程也是先创建传输控制块TCB, 然后向服务器发出连接请求报文,此时报文首部中的同步标志位SYN=1, 同时选择一个初始序列号 seq = x, 此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定, SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。 
3, TCP服务器收到请求报文后, 如果同意连接, 则发出确认报文。确认报文中的 ACK=1, SYN=1, 确认序号是 x+1, 同时也要为自己初始化一个序列号 seq = y, 此时, TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据, 但是同样要消耗一个序号。 
4, TCP客户端进程收到确认后还, 要向服务器给出确认。确认报文的ACK=1,确认序号是 y+1,自己的序列号是 x+1. 
5, 此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

不用两次的原因

主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送的第一个请求连接并且没有丢失,只是因为在网络中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时之前滞留的那一次请求连接,因为网络通畅了, 到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的费。 
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

不用四次的原因

因为三次已经可以满足需要了, 四次就多余了.

2.2.2 四次挥手

数据传输完毕后,双方都可以释放连接. 
此时客户端和服务器都是处于ESTABLISHED状态,然后客户端主动断开连接,服务器被动断开连接.

1, 客户端进程发出连接释放报文,并且停止发送数据。 
释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 
2, 服务器收到连接释放报文,发出确认报文,ACK=1,确认序号为 u+1,并且带上自己的序列号seq=v,此时服务端就进入了CLOSE-WAIT(关闭等待)状态。 
TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。 
3, 客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最终数据) 
4, 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,确认序号为v+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。 
5, 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,确认序号为w+1,而自己的序列号是u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。 
6, 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。


  转载请注明: Tomorrow TCP协议

 上一篇
API测试框架 API测试框架
API测试框架简略 这个框架主要的目的是想偷懒,哈哈哈。为了实现在接口测试用例完成的情况下,免去人工手动去提取测试数据到数据驱动文件中。手工提取不能保证数据提取的准确性,而且数据的更新的同时还需要手工去修改数据驱动文件,费时费力。 原理T
2019-03-12
本篇 
TCP协议 TCP协议
1. 基本概念 名称 中文全称:传输控制协议 英文全称:Transmission Control Protocol 特点 面向连接的 双方必须建立连接才可以进行数据的读写 可靠的 基于字节流的 2. 传输过程2.1 报头 源
2019-03-12