TCP/IP详解(包含ack,seq)

时间:2023-03-09 05:41:32
TCP/IP详解(包含ack,seq)

前言

个人认为在web开发中,对于TCP/IP协议的理解是首当其冲的,在大多数框架的冲击下,使我们淡化了对于TCP/IP协议的理解。

理解好TCP/IP对于每个web开发者都是很有必要的。

TCP/IP协议

TCP/IP协议特点

  • tcp是面向连接(虚连接)的传输层协议
  • 每一条tcp只能有两个端点,所以说tcp协议是点到点的
  • tcp提供可靠交付的服务,无差错,不丢失,不重复,按序到达
  • tcp提供全双工通讯---发送缓存和接收缓存
  • tcp面向字节流--tcp把应用程序交下来的数据看成仅仅是一连串的无结构的字符流(这些字符都是被编上序号的,发送时选取一段字符并添加报文首部信息进行发送)

通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上运作 的。而 HTTP 属于它内部的一个子集。

TCP/IP协议模型

1.TCP/IP使用的是四层模型

①应用层--->②传输层(tcp协议)--->③网络层(IP协议)--->④数据链路层

1.应用层

应用层决定了向用户提供应用服务时通信的活动。 TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和 DNS(Domain Name System,域 名系统)服务就是其中两类。 HTTP 协议也处于该层。

2.传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据 传输。 在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报 协议)。

3.网络层(又名网络互连层)

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数 据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计 算机,并把数据包传送给对方。 与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所 起的作用就是在众多的选项内选择一条传输路线。

4.链路层(又名数据链路层,网络接口层)

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱 动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等 物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在 链路层的作用范围之内。

利用 TCP/IP 协议族进行网络通信时,会通过分层顺序与对方进行通 信。发送端从应用层往下走,接收端则往应用层往上走。

我们用 HTTP 举例来说明,首先作为发送端的客户端在应用层 (HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求。

接着,为了传输方便,在传输层(TCP 协议)把从应用层处收到的数 据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端 口号后转发给网络层。

在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链 路层。这样一来,发往网络的通信请求就准备齐全了。

接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用 层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP 请求。

TCP/IP详解(包含ack,seq)

确保可靠性的TCP协议

按层次分,TCP 位于传输层,提供可靠的字节流服务。

所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大 块数据分割成以报文段(segment)为单位的数据包进行管理。而可 靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之, TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够 确认数据最终是否送达到对方。

确保数据能到达目标 为了准确无误地将数据送达目标处,TCP 协议采用了三次握手 (three-way handshaking)策略。用 TCP 协议把数据包送出去后,TCP 不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。

若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发 送相同的数据包。

TCP/IP在传送报文的过程中使用了缓存

即发送缓存和接收缓存;

发送方会将发送的数据先放到缓存中,缓存中的数据会被分割成报文段,发送到接收方,如果接收方确认接收到了数据,该数据就会在发送方的缓存里被清除。

同样,接收方也会有接收缓存,当接收方的缓存满了,它就会通知发送方不要再继续发送了,接收方将数据传给应用层,此时接收方缓存里的数据被清空,它会

继续通知发送方继续发

在讲解三次握手协议之前,我们需要知道TCP数据包的格式,之前也说明了TCP协议将大量数据分成许多少量数据并添加首部信息(即数据包) 进行传输的。

这里,我们需要先来分析一下TCP的首部信息里包含了什么

TCP/IP详解(包含ack,seq)

首部固定长度为20B,可能会有拓展的一些字段,这些拓展的字段放在选项中(即图中最后一行的选项里),而填充的字段是为了满足这一行是32位。也可以说是为了方便传输

首部信息分析

1.第一行(源端口和目的端口)

即接收端口

2.第二行(序号)

上文提到了TCP使面对字节流的,每一个字节都会按顺序编号,这个序号就是本段报文所发送数据的第一个字节的序号(seq)

3.第三行(确认号)

表示期望收到发送方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到

4.第四行

第四行由 数据偏移+保留+6个控制位+窗口组成

TCP/IP详解(包含ack,seq)

数据偏移:TCP报文段的数据起始处距离报文段的起始处有多远(即首部的长度),以4B为单位,即1个数值是4B

虽然固定的首部是20B,但是有的时候难免会有一些其他的需要去拓展首部 所以说TCP报文的首部是>=20B的

保留:也就是保留...

然后就是6个控制位

  • URG紧急位:URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用再缓存里排队,配合紧急指针使用
  • ACK确认位:ACK=1时确认号有效,在连接建立后所有传送的报文都必须把ACK置为1
  • PSH推送位:PSH=1时,接收方尽快交付接收进程,不用等到缓存填满再向上交付
  • RST复位:RST=1时,表明tcp连接中出现了严重差错,必须释放连接,然后再重新建立传输连接
  • SYN同步位:SYN=1时,表明是一个连接请求/连接请求接收报文
  • FIN终止位:FIN=1时,表明此报文发送方数据已发完,要求释放连接

窗口:指的是发送本报文段的一方的接收窗口(接收缓存),即现在允许对方发送的数据量

5.第五行

校验和+紧急指针

校验和:校验首部+数据,校验时要加上12B伪首部,第四个字段(协议字段)为6(tcp为6 udp为17)

紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数

6.第六行

选项+填充

选项:最大报文长度MSS、窗口扩大、时间戳、选择确认....

现在我们再来分析前面三次握手的协议,理解起来就很简单了

TCP/IP三次握手(TCP连接)

TCP/IP详解(包含ack,seq)

在第一次消息:

Client发送连接请求报文段,无应用层的数据

  此时同步标志位SYN=1,seq(序号)=x(随机)

第二次消息

Server为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据

  此时同步标志位SYN=1,确认标志位ACK=1(有确认标志位,确认号ack才有效,表示Server已经成功接收Client的数据),确认号ack=x+1 (Client发送过来的前x个数据都已接收,现在期望获取到x+1的数据)  seq=y(随机)

第三次消息

Client为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,此时可以携带数据了

同步标志位SYN=0(只有在连接请求和连接请求接收时SYN才为1)  确认标志位ACK=1 seq =x+1(在第一次中已经发送了x个,现在从x后面一个发起,故是x+1)  ack=y+1(Server端发送了y个,期望收到y+1及以后的数据)

TCP四次挥手(释放连接)

TCP/IP详解(包含ack,seq)

第一次消息:

Client发送连接释放报文,停止发送数据,主动关闭TCP连接

  终止位标志位FIN=1,seq=u(此时该报文里无数据,序号仅仅是用来标识该报文段)

第二次消息:

Server返回一个确认报文段,Client到Server这个方向的连接就释放了,此时TCP处于半关闭状态

确认位标志位ACK=1,seq=v(因为之前不知道Server发送到哪里了,故用v表示) 确认号ack=u+1

此时的Client已经不再发送数据了,等待Server发送关闭连接的报文过来

第三次消息:

Server发送完数据,就发出连接释放报文段,主动关闭TCP连接

终止位标志位FIN=1,确认位标志位ACK=1,seq=w,ack=u+1(第二次消息的时候Client已经关闭没有发出确认信息,所以此时确认号与之前相同)

第四次消息:

Client 回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭

确认位标志位ACK=1,seq=u+1,ack=w+1

此处需要等待计时器设置的2MSL,因为此次报文可能会丢失,如果不等待那么Server可能永远关闭不了。

此处等待,若报文丢失,Server会重传,Client端接收到Server关闭状态,会更新等待计时器,再发送消息给Server

最后,补充一小点。

在http1.0中,每一次请求都会建立一次连接,而在http1.1中,通过头部keep-alive字段可设置长连接,在一次连接之内请求所有资源。

转载请标明出处:https://www.cnblogs.com/Qiansion/