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协议
按层次分,TCP 位于传输层,提供可靠的字节流服务。
所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大 块数据分割成以报文段(segment)为单位的数据包进行管理。而可 靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之, TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够 确认数据最终是否送达到对方。
确保数据能到达目标 为了准确无误地将数据送达目标处,TCP 协议采用了三次握手 (three-way handshaking)策略。用 TCP 协议把数据包送出去后,TCP 不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。
若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发 送相同的数据包。
TCP/IP在传送报文的过程中使用了缓存
即发送缓存和接收缓存;
发送方会将发送的数据先放到缓存中,缓存中的数据会被分割成报文段,发送到接收方,如果接收方确认接收到了数据,该数据就会在发送方的缓存里被清除。
同样,接收方也会有接收缓存,当接收方的缓存满了,它就会通知发送方不要再继续发送了,接收方将数据传给应用层,此时接收方缓存里的数据被清空,它会
继续通知发送方继续发
在讲解三次握手协议之前,我们需要知道TCP数据包的格式,之前也说明了TCP协议将大量数据分成许多少量数据并添加首部信息(即数据包) 进行传输的。
这里,我们需要先来分析一下TCP的首部信息里包含了什么
首部固定长度为20B,可能会有拓展的一些字段,这些拓展的字段放在选项中(即图中最后一行的选项里),而填充的字段是为了满足这一行是32位。也可以说是为了方便传输
首部信息分析
1.第一行(源端口和目的端口)
即接收端口
2.第二行(序号)
上文提到了TCP使面对字节流的,每一个字节都会按顺序编号,这个序号就是本段报文所发送数据的第一个字节的序号(seq)
3.第三行(确认号)
表示期望收到发送方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到
4.第四行
第四行由 数据偏移+保留+6个控制位+窗口组成
数据偏移: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连接)
在第一次消息:
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四次挥手(释放连接)
第一次消息:
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/