TCP协议

一、介绍

1、它是什么

Transmission Control Protocol,即 传输控制协议。

  (1)属于 传输层通信协议;
  (2)基于TCP的应用层协议有HTTP、SMTP、FTP、Telnet 和 POP3。

2、为什么需要它

  • 面向连接、面向字节流、全双工通信、可靠
  • 优点:数据传输可靠
  • 缺点:效率慢(因需建立连接、发送确认包等)

二、报文格式

TCP虽面向字节流,但传送的数据单元 = 报文段。
报文段 = 首部 + 数据 2部分。
TCP的全部功能体现在它首部中各字段的作用,故下面主要讲解TCP报文段的首部。
  首部前20个字符固定、后面有4n个字节是根据需而增加的选项。
  故 TCP首部最小长度 = 20字节。

1Source Port(源端口号):数据发起者的端口号,16bit

2Destination Port(目的端口号):数据接收者的端口号,16bit

3SequenceNumber(顺序号码,Seq)序号:用于在数据通信中解决网络包乱序(reordering)问题,以保证应用层接收到的数据

不会因为网络上的传输问题而乱序(TCP会用这个顺序号码来拼接数据),32bit。例如序号为301,表示第一个字节的编号为301

如果携带的数据长度为100字节,那么下一个报文段的序号应为401

4Acknowledgment Number(确认号码,ack)确认号:期望收到的下一个报文段的序号。是数据接收方期望收到发送方在下一个报

文段的顺序号码(Seq),因此确认号码应当是上次已成功收到顺序号码(Seq)加132bit。例如 B 正确收到 A 发送来的一个报文段,

序号为501,携带的数据长度为200字节,因此 B 期望下一个报文段的序号为701B 发送给 A 的确认报文段中确认号就为701

5OffsetTCP报文头长度)数据偏移:指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。

用于存储报文头中有多少个32bit(上图的一行),存储长度为4bit,最大可表示(2^3+2^2+2^1+1*32bit=60bytes的报文头。

最小取值55*32bit=20bytes

6Reserved(保留):6bit, 均为0

7TCP FlagsTCP标志位)控制位:八位从左到右分别是 CWRECEURGACKPSHRSTSYNFIN。每个长度均为1bit

    CWR:压缩,0x80值。CWR 标志与后面的 ECE 标志都用于 IP 首部的 ECN 字段,ECE 标志为1时,则通知对方已将拥塞窗口缩小;

    ECE:拥塞,0x40值。若其值为1则会通知对方,从对方到这边的网络有阻塞。在收到数据包的 IP 首部中 ECN 1时将 TCP 首部中的 ECE 设为1

    URG:紧急,0x20。当URG=1,表示包中有需要紧急处理的数据,对于需要紧急处理的数据,与后面的紧急指针有关;

    ACK:确认,0x10。当ACK=1,确认应答的字段有效,TCP规定除了最初建立连接时的 SYN 包之外该位必须设为1,当取值0则不是确认包;

    PSH:推送,0x08。当PSH=1,表示需要将收到的数据立刻传给上层应用协议,若设为0,则先将数据进行缓存;

    RST:复位,0x04。当RST=1,表示 TCP 连接出现异常必须强制断开连接,必须释放连接,再重新建立连接。;

    SYN:同步,0x02。在建立连接是用来同步序号。SYN=1 ACK=0表示一个连接请求报文段。SYN=1ACK=1表示同意建立连接;

    FIN:终止,0x01。该位设为1,表示今后不再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位置为1 TCP 段。

每个主机又对对方的 FIN 包进行确认应答之后可以断开连接。不过,主机收到 FIN 设置为1 TCP 段之后不必马上回复一个 FIN 包,

而是可以等到缓冲区中的所有数据都因为已成功发送而被自动删除之后再发 FIN 包;

8、窗口:窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。

9、检验和:该字段检验的范围包括头部和数据这两部分。由发端计算和存储,并由收端进行验证。

10、紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。

11TCP选项:长度可变,最长可达40字节

备注:ISNInital SequenceNumber):初始化Sequence Number,发生在建立连接时。

 当网络通信时采用 TCP 协议时,在真正的读写操作之前,server 与 client 之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要 3 次握手的,而释放则需要 4 次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的。

1、建立连接过程

 

 

 

 

 

成功进行TCP的三次握手后,就建立起一条TCP连接,即可传送应用层数据。

注:

  因 TCP提供的是全双工通信,故通信双方的应用进程在任何时候都能发送数据。
  三次握手期间,任何1次未收到对面的回复,则都会重发。
特别说明:为什么TCP建立连接需三次握手?
结论
  防止服务器端因接收了早已失效的连接请求报文,从而一直等待客户端请求,最终导致形成死锁、浪费资源

N洪泛攻击:

  从上可看出:服务端的TCP资源分配时刻 = 完成第二次握手时;而客户端的TCP资源分配时刻 = 完成第三次握手时
  这就使得服务器易于受到SYN洪泛攻击,即同时多个客户端发起连接请求,从而需进行多个请求的TCP连接资源分配

2、释放连接过程

 

 

特别说明:为什么TCP释放连接需四次挥手?

  • 结论
    为了保证通信双方都能通知对方 需释放 & 断开连接

即释放连接后,都无法接收 / 发送消息给对方

延伸疑问:为什么客户端关闭连接前要等待2MSL时间?
  即 TIME - WAIT 状态的作用是什么;
  MSL = 最长报文段寿命(Maximum Segment Lifetime)

原因1:为了保证客户端发送的最后1个连接释放确认报文 能到达服务器,从而使得服务器能正常释放连接。
原因2:防止 上文提到的早已失效的连接请求报文 出现在本连接中。
客户端发送了最后1个连接释放请求确认报文后,再经过2MSL时间,则可使本连接持续时间内所产生的所有报文段都从网络中消失。

即 在下1个新的连接中就不会出现早已失效的连接请求报文。

posted @ 2021-07-31 18:55  Einewhaw  阅读(21)  评论(0编辑  收藏  举报