计算机网络---TCP

发布于:2022-11-13 ⋅ 阅读:(863) ⋅ 点赞:(0)

(一)TCP概述

        TCP协议的定义:传输控制协议TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793  定义。

      TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

      TCP协议的特点:TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复问题。TCP是TCP/IP体系中非常复杂的一个协议,主要特点如下:

  •  TCP是面向连接传输层协议,TCP连接是一条逻辑连接

  •  每条TCP连接只能有两个端点,每条TCP连接只能是端到端的(进程对进程)。

  • TCP提供可靠交付的服务,保证传送的数据无差错、不丢失、不重复且有序。

  •   TCP提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,为此TCP连
    接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
    发送缓存用来暂时存放以下数据:①发送应用程序传送给发送方TCP准备发送的数据;②TCP已发送但尚未收到确认的数据。                                                                           接收缓存用来暂时存放以下数据:①按序到达但尚未被接收应用程序读取的数据;②不按序到达的数据。

  •  TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但
    TCP把应用程序交下来的数据仅视为一连串的无结构的字节流。                                   TCP 和UDP在发送报文时所采用的方式完全不同。UDP报文的长度由发送应用进程决定,而TCP报文的长度则根据接收方给出的窗口值和当前网络拥塞程度来决定。如果应用进程传送到TCP缓存的数据块太长,TCP就把它划分得短一些再传送;如果太短,TCP也可以等到积累足够多的字节后再构成报文段发送出去。


 
(二) TCP 报文段


        TCP传送的数据单元称为报文段。TCP报文段既可以用来运载数据,又可以用来建立连接、释放连接和应答。一个TCP报文段分为首部和数据两部分,整个TCP报文段作为IP数据报的数据部分封装在IP数据报中,如下图所示。其首部的前20B是固定的。TCP首部最短为20B,后面有4N字节是根据需要而增加的选项,长度为4B的整数倍。

TCP的全部功能体现在其首部的各个字段中,各字段意义如下:

  •  源端口和目的端口,各占2B。端口是运输层与应用层的服务接口运输层的复用和分用
    功能都要通过端口实现。

  •   序号,占4B,范围为0~(2^32)  -1,共2^23个序号。TCP是面向字节流的(即TCP传送时是逐个字节传送的),所以TCP连接传送的字节流中的每个字节都按顺序编号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
    例如,一报文段的序号字段值是301,而携带的数据共有100B,表明本报文段的数据的
    最后一个字节的序号是400,因此下一个报文段的数据序号应从401开始。

  • 确认号,占4B,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,

则表明到序号 N-1 为止的所有数据都已正确收到。

  •  数据偏移(即首部长度),占4位,这里不是IP数据报分片的那个数据偏移,而是表示
    首部长度(首部中还有长度不确定的选项字段),它指出 TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位是32位(以4B为计算单位)。由于4位二进制数能表示的最大值为15,因此 TCP 首部的最大长度为60B。

  •  保留,占6位,保留为今后使用,但目前应置为0。

  • 紧急位 URG,当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数
    据,应尽快传送(相当于高优先级的数据)。但URG需要和首部中紧急指针字段配合使
    用,即数据从第一个字节到紧急指针所指字节就是紧急数据。

  •  确认位 ACK,仅当ACK =1时确认号字段才有效。当ACK=0时,确认号无效。
    TCP 规定,在连接建立后所有传送的报文段都必须把ACK 置 1。

  • 推送位PSH(Push),接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。

  • 复位位RST(Reset),当RST=1时,表明TCP连接中出现严重差错(如主机崩溃或其
    他原因),必须释放连接,然后再重新建立运输连接。

  •  同步位SYN,当SYN=1时表示这是一个连接请求或连接接受报文。当SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则应在响应报文中使用SYN=1,ACK=1。

  •  终止位 FIN(Finish),用来释放一个连接。当 FIN=1时,表明此报文段的发送方的数
    据已发送完毕,并要求释放运输连接。

  •  窗口,占2B,范围为0~(2^16) -1。它指出现在允许对方发送的数据量,接收方的数据缓
    存空间是有限的,因此用窗口值作为接收方让发送方设置其发送窗口的依据。

  • 校验和,占 2B。校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和
    UDP一样,要在TCP报文段的前面加上12B的伪首部(只需将UDP伪首部的第4个字
    段,即协议字段的17改成6,其他的和UDP一样)。

  •  紧急指针,占2B。紧急指针仅在URG=1时才有意义,它指出在本报文段中紧急数据
    共有多少字节(紧急数据在报文段数据的最前面)。

  • 选项,长度可变。TCP最初只规定了一种选项,即最大报文段长度(Maximum Segment Size,MSS)。MSS是TCP报文段中的数据字段的最大长度(注意仅仅是数据字段)。

  •  填充。这是为了使整个首部长度是4B 的整数倍.
     

 

(三)TCP连接管理

       TCP 是面向连接的协议,因此每个TCP 连接都有三个阶段:连接建立数据传送连接释
放。TCP 连接的管理就是使运输连接的建立和释放都能正常进行。
在TCP 连接建立的过程中,要解决以下三个问题:
  ①要使每一方能够确知对方的存在。
  ②要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项及服务
质量等)。
  ③能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
        TCP把连接作为最基本的抽象,每条TCP连接有两个端点,TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。TCP连接的端口即为套接字(Socket)或插口,每条TCP 连接唯一地被通信的两个端点(即两个套接字)确定。
       TCP 连接的建立采用客户/服务器模式。主动发起连接建立的应用进程称为客户(Client),而被动等待连接建立的应用进程称为服务器(Server)。
Ⅰ  TCP 连接的建立
连接的建立经历以下3个步骤,通常称为三次握手,如图5.7所示。



       连接建立前,服务器进程处于 LISTEN(收听)状态,等待客户的连接请求。
       第一步:客户机的TCP首先向服务器的TCP发送连接请求报文段。这个特殊报文段的首部中的同步位 SYN 置 1,同时选择一个初始序号 seq =x。TCP 规定,SYN 报文段不能携带数据,但要消耗掉一个序号。这时,TCP 客户进程进入SYN-SENT(同步已发送)状态。
        第二步:服务器的TCP收到连接请求报文段后,如同意建立连接,则向客户机发回确认,并为该TCP连接分配缓存和变量。在确认报文段中,把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。注意,确认报文段不能携带数据,但也要消耗掉一个序号。这时,TCP 服务器进程进入 SYN-RCVD(同步收到)状态
        第三步:当客户机收到确认报文段后,还要向服务器给出确认,并为该TCP连接分配缓存和变量。确认报文段的ACK位置1,确认号ack=y+1,序号seq=x+1。该报文段可以携带数据,若不携带数据则不消耗序号。这时,TCP 客户进程进入ESTABLISHED(已建立连接)状态。
        成功进行以上三步后,就建立了TCP连接,接下来就可以传送应用层数据。TCP提供的是
全双工通信,因此通信双方的应用进程在任何时候都能发送数据。
         另外,服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的,这就使得服务器易于受到SYN洪泛攻击。



Ⅱ   TCP 连接的释放
  参与TCP连接的两个进程中的任何一个都能终止该连接。TCP 连接释放的过程通常称为四次握手,如图5.8所示。
 

       第一步:客户机打算关闭连接时,向其TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接,该报文段的终止位FIN置1,序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1,FIN 报文段即使不携带数据,也消耗掉一个序号。这时,TCP客户进程进入FIN-WAIT-1(终止等待1)状态。TCP是全双工的,即可以想象为一条TCP连接上有两条数据通路,发送FIN的一端不能再发送数据,即关闭了其中一条数据通路,但对方还可以发送数据。
      第二步:服务器收到连接释放报文段后即发出确认,确认号ack=u+1,序号 seq=v,等于它前面已传送过的数据的最后一个字节的序号加1。然后服务器进入CLOSE-WAIT(关闭等待)状态。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭.
    第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时,其发出FIN=1的连接释放报文段。设该报文段的序号为w(在半关闭状态服务器可能又发送了一些数据),还须重复上次已发送的确认号ack=u+1。这时服务器进入LAST-ACK(最后确认)状态。
       第四步:客户机收到连接释放报文段后,必须发出确认。把确认报文段中的确认位ACK置1,确认号ack=w +1,序号 seq=u+1。此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL(最长报文段寿命)后,客户机才进入CLOSED(连接关闭)状态。

 

 

 

本文含有隐藏内容,请 开通VIP 后查看