计算机网络通信之探究TCP/IP协议

      最后更新:2022-02-09 18:05:20 手机定位技术交流文章

      TCP/IP协议简介

      TCP/IP【TCP(传输控制协议)和IP(网际协议)】提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。

      它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。
      在这里插入图片描述

      协议族下的各种协议,依其功能不同,被分别归属到这四个层次结构之中,常被视为是简化的七层OSI模型。

      TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议。
      数据在传输前要建立连接,传输完毕后还要断开连接,客户端在收发数据前要使用 connect() 函数和服务器建立连接。
      建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
      TCP建立连接时要传输三个数据包,俗称三次握手,后面会进行详细讲解

      TCP数据报结构

      在这里插入图片描述

      带阴影的几个字段需要重点说明一下:
      (1) 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
      (2) 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
      (3) 标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:

      TCP协议的三次握手

      如下图所示:
      在这里插入图片描述

      握手过程

      第一次握手

      1、客户端给服务器发送一个同步报文段SYN,并指定客户端的初始序列号ISN,此时客户端处于SYN_SENT状态。
      2、首部的同步位SYN = 1(SYN只是一个比特位,0表示不是SYN,1表示是SYN),初始 序列号seq = m。
      3、SYN = 1的报文段不能携带任何的数据,但要指定序号。

      第二次握手

      1、服务器接收到来自客户端的同步报文段SYN后,会以自己的SYN报文作为应答,并且也指定了自己的初始序列号ISN。同时会把客户端的 seq+1 确认序列号ack的值,表示自己已经收到了客户端的同步报文段SYN,此时服务器处于SYN_RCVD的状态。
      2、确认报文段中SYN = 1,ACK = 1(ACK也只是一个比特位,0表示不是ACK,1表示是 ACK),确认序列号ack = m+1,初始序列号seq = n。

      第三次握手

      1、客户端收到来自服务器的同步报文段SYN之后,会发送一个确认报文段ACK,以服务器的 seq+1作为ack的值 ,表明自己已经收到来自服务器的同步报文段SYN。客户端进入ESTABLISHED状态,服务器确认报文段ACK之后,也会进入ESTABLISHED状态。
      2、确认报文段中,ACK = 1,确认序列号 ack = n+1,序列号 seq = m+1。
      3、双方已经建立起连接,可以正常的发送数据。

      举个例子(打电话):

      TCP协议的四次挥手

      如下图所示:
      在这里插入图片描述
      挥手过程

      1、第一次挥手:当数据传输结束以后,客户端的应用进程发出连接释放报文段,并停止发送数据,其首部:FIN=1,seq=u。

      2、第二次挥手:服务器端收到连接释放报文段之后,发出确认报文,其首部:ACK=1,seq=v,ack=u+1。此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据。而服务器端仍会继续发送。

      3、第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。

      4、第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再经过2MSL(Maximum Segment Lifetime最长报文寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。

      在这个过程中:
      ESTAB-LISHED:连接建立状态
      FIN-WAIT-1:终止等待1状态
      FIN-WAIT-2:终止等待2状态
      CLOSE-WAIT:关闭等待状态
      LAST-ACK:最后确认状态
      TIME-WAIT:时间等待状态
      CLOSED:关闭状态

      TCP协议的常见问题

      (1)为什么会采用三次握手,若采用二次握手可以吗?

      采用三次握手是为了防止失效的连接请求报文段突然又传送到服务器端,因而产生错误。失效的连接请求报文段是指:客户端发出的连接请求没有收到服务器的确认,于是经过一段时间后,客户端又重新向服务器发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,客户端第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到服务器,服务器以为是客户端又发起的新连接,于是服务器同意连接,并向客户端发回确认,但是此时客户端根本不会理会,服务器就一直在等待客户端发送数据,导致服务器的资源浪费。

      (2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

      这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

      附:参考资料

      1、 TCP三次握手和四次挥手的全过程
      2、 TCP三次握手详解

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/18073.html

          热门文章

          文章分类