1 七层网络协议
首先作为我们要交流的基础,我们先上张图,七层网络协议,具体每一层都干了什么就不作具体讲解了。了解 七层协议就行
七层协议模型
2 七层协议对应数据格式*
我们要说的Tcp位于传输层,我们知道,对报文的处理,在经过每一层都会经过一次封装头或者解析头的过程,各层的封装与解析如下图所示
七层协议对应的数据格式
我们tcp在传输层,主要解析的是tcp头,传输的控制数据在存在tcp头部下面,到了传输层,我们的数据就只包含tcp头和体数据了,我们就一起来探讨下
1 tcp服务模型的特征与
2 tcp头部包含了哪些信息解析后分别起到了什么作用
3 建立连接断开连接机制
3 Tcp的服务模型的特征
我们现在常用的http服务就是基于tcp连接的,tcp总结起来有以下几个特征
1 面向连接的传输,传输前必须先建立连接。传输完毕需要断开连接。
2 仅支持单播传输。只能进行端到端的传输,不支持多播和广播传输
3 传输单元为数据段,传输单位为字节,字节过长时将其分段(数据段大小可变,最小为21字节)
4 支持全双工传输,允许通信双方随时都能够发送数据,因为tcp通信两端都设有缓存,用于存放临时双方通信的数据。当然tcp也能立即发送一个接受到的数据段(URG配合紧急指针oobinline来实现),也可以缓存一段时间后发送。
5 URG配合紧急指针实现数据及时发送
6 可变tcp数据段大小和tcp数据段的个数
7 重传策略保证数据的安全性
4 tcp的段结构
tcp能够支持上面集中特性,与tcp的结构是密不可分的。tcp的头可分为10部分,每一部分都是极其重要的,都控制住tcp连接的一个部分。下面,我们得先来看看tcp头部都包含了哪些部分(如图)
1 源端口:16bit告诉主机该报文段从哪里来, 客户端是系统自动选择的端口号,服务器不同协议默认使用不同 的端口号(如http协协议,默认80端口)
2 目标端口:16bit,目标节点端口,就是要传输给上层哪个程序。
3 序列号:32bit,是数据段的序列号。tcp字节流中每个字节都有编号,我们这次传输的数据段大小是100个数据字节。第一个字节的编号是一个随机值ISN,那么这段字节的序列号就是ISN+1,ISN+2, ISN+3,…,ISN+100等
4 确认号:32bit,用于对另一方发过来的序列号进行确认,他的数值是序列号的数值加一,同时也表示该字节 序号前面的字节全部接收。
5 数据偏移(头长度):4bit,表示tcp头的长度为多少字节,也表示数据 的偏移,一共4位,最大表示数为
15,所以头长度 最大15位,60个字节
6 标志位(6位):分别为1 URG标志,表示紧急指针是否有效ACK标志,表示确认号是否有效。称携带
2 ACK标志 的tcp报文段位确认报文段
3 PSH标志,提示接收端应用程序应该立即从tcp接受缓冲区中读 走数据,为 接受后续数据腾出空间(如果应用程序不将接收的数据读走,它 们就会一直停留在tcp缓冲区中)
4 RST标志,表示要求对方重新建立连接。携带RST标志的tcp报文段为复位报 文段。
5 SYN标志,表示请求建立一个连接。携带SYN标志的tcp报文段为同步报文
6 FIN标志,表示通知对方本端要关闭连接了。携带FIN标志的tcp报文段为结束报文段。
7 窗口:16bit,是tcp流量控制的一个手段。这里说的窗口,指的是接收通告 窗口。它告诉对方本端的tcp接
收缓冲区还能容纳多少字节的数据,这样对方就可以根据这个值来改变自己的发送窗口的大小。
8 检验和 :16bit,由发送端填充。接收端对tcp报文段执行CRC算法来校验tcp报文段是否在传输层被损
坏。
9 紧急指针:16bit,当URG=1时这段部分才起作用。紧急指针是一个偏移量,指向紧急数据与非紧急数据的
临界点,紧急数据起点是序列号,终点是序列号+紧急数据大小。所以 我们也称其为紧
10 选项(可变长度):部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字 节
的固定部分),还要 保证利用填充字段保证tcp头是4的整数倍。 急偏移。紧急指针
内的数据不走tcp的数据缓冲区,能够立即发送传输的数据
到这里tcp头的几个段都已经简单介绍了。tcp头是控制tcp数据传输的主要机制。 也是tcp连接,断开,传输,重 传的支持。理解非常重要,是我们介绍接下来内容的基础。
5 tcp的连接建立
传输控制协议tcp协议基于连接的传输协议。数据传输前需要建立逻辑连接 tcp采取的机制是三次握手协议,以
此来建立全双工的连接。
第一次握手:客户端的应用进程主动打开,并向客户端发出请求报文段。其首部中:SYN=1,seq=x。
第二次握手:服务器应用进程被动打开。 若同意客户端的请求,则发回确认报文 其首部中:
SYN=1,ACK=1,ack=x+1,seq=y。
第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出 a确认报文,其首部:
ACK=1,ack=y+1。当服 务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。
至此 tcp三次握手完成,连接建立
6 tcp连接的释放
tcp是全双工协议,所以断开连接需要采用对称释放的方式。
1 第一次挥手:A接收到应用层的通知,发送请求断开连接的数据段
2 第二次挥手: B发送应答段,表明数据传输完成,同意B的请求
3 第三次挥手:B接收到应用层的通知,请求终止连接
4 第四次挥手:A接到B的请求,同意断开连接
如果是笼统的说,这样已经逻辑完整的完成tcp断连了。但是,在这期间,服务 器如何识别四次挥手的是同一个客户端,还有在断连过程中,第二次挥手到第三次挥手期间是可以进行单向数据传输的。四次挥手期间,Tcp连接的状态分别是什么,相信大家都和我一样很感兴趣。
如果细说四次挥手,我们可以将其分为8个阶段,(同时我也画了一 个示意图,如下)
1 开始时,A,B都处于established状态, 可以进行双向传输状态
2 A接收到应用层的通知,停止发送数据关闭tcp连接,报文头标志位的FIN=1序号seq=x+1,x是已传输数据的
最后一 个字 节序号。A进入FIN-WAIT-1状态(终止等待1)状态,等待B的确认。FIN报文
段即使不携带数据也要消耗一个序号
3 B收到A的请求释放报文,确认 号X+2B的序列号是Y+1,Y是已传输数据的最后一个字节B进入Close- wait
状态(关闭等 待)。TCP服务器进程通知高层应用进程,从A到B的连接被释放了。这条Tcp 连接进入半关
闭状态。
4 A收到B的确认,进入FIN-WAIT-2(终止等待2)状态 等待B发出连接释放报文段。
5 B应用进程通知Tcp释放连接,报文段首部FIN=1,序号为seq=Z+1半连接状态B可能又向A发送了一段数
据,B重复上次的确认号ack=X+2,B进入last-ack(最后等待)状态,等待A的回复。
6 A收到B的断连报文,向B发出确认,ACK=1,确认号ack=Z+2A的序号seq=X+2,A进入time-wait状态
7 A 经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A进入CLOSED状态。
8 B收到A的确认,进入closed状态,撤销传输控制块TCB,Tcp连接释放成功
(如下图)
到这里,tcp四次挥手就介绍完了,后续的TCP滑动窗口控制,重传策略,拥塞控制,会在后续的里面介绍
谢谢