【前言】
在计算机网络模型中,有一种基于国际标准的OSI七层模型和基于事实标准的TCP/IP四层模型,本篇博文就来介绍一下两种模型。
OSI模型全称为Open System interconnection reference model(开放式系统互联通信参考模型),一种国际标准的概念模型,定义于ISO/IEC 7498-1。
OSI模型图如下:
OSI模型分为七层,每一层有其固定的作用:
第七层:应用层
网络进程到应用程序。针对特定应用规定各层协议、时序、表示等,进行封装。在端系统中用软件来实现,如HTTP等
第六层:表示层
数据表示形式,加密和解密,把机器相关的数据转换成独立于机器的数据。规定数据的格式化表示,数据格式的转换等
第五层:会话层
主机间通讯,管理应用程序之间的会话。规定通信时序;数据交换的定界、同步,创建检查点等
第四层:传输层
以数据段(segment)为单位进行传输,
第三层:网络层
决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成分组。在该层中以数据包(packet)为单位进行传输。在网络的各个节点之间可靠地分发数据包。
第二层:数据链路层
数据链路层的单位为帧(frame),负责网络寻址、错误侦测和改错。一个可靠的点对点数据直链。
第一层:物理层
在物理层中以比特流(bit)来相互之间进行通信。
原理:在进行网络通信时,从数据接收端的应用层向下发送,每一层在其数据包前加上头部的封装信息,一直到物理层就会形成如上图所示的样式。这样在数据接收端接到发送端发过来的包时,从物理层向上层传输,到达每层的时候每层都要做解封装的操作,一直传到应用层,得出原始的发送端的数据包,这样就完成了一次网络传输。
需要注意的是,OSI模型中,下层为上层提供服务,但是上层有时候不仅仅只有一个协议类型,也可能有多个,所以需要下层指定上层协议的类型。怎么指定?以数据链路层为例,可以从其帧结构中看出:
其中前同步码的长度是固定的8位(注意是位),后面是目标端口的Mac地址,源端口的Mac地址,在接下来就是两位的类型,用来指定上层服务的协议类型,数据位的大小是一个范围,在46-1500位之间,最后是CRC循环冗余校验,这事一整个帧的结构,所以一个帧的大小范围也就为72-1572。
【TCP/IP协议栈】
TCP/IP协议栈,顾名思义有两个核心协议:TCP协议(传输控制协议)和IP协议(网际协议)。由于在网络通讯协议普遍采用分层的结构,当多个层次的协议共同工作时,类似计算机科学中的堆栈,因此又被称为TCP/IP协议栈。最早发源于美国国防部(缩写为DoD)的因特网的前身ARPA网项目,1983年1月1日,TCP/IP取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准。TCP/IP称为事实标准,它相比于OSI模型来说只有四层结构:
其中
应用层:HTTP、FTP、DNS
传输层 :TCP 、UDP、RTP、SCTP
Internet层 :IP、ICMP、ARP、RARP协议等
网络接口层:以太网、Wi-Fi、MPLS等
TCP/IP提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。
下面来重点介绍一下工作在传输层的TCP和UDP协议。
TCP是工作在传输层的面向连接的协议。具有以下特征:
面向连接的、可靠地、具有序列化(发送的包具有编号,按顺序发送)
半关闭其中的端口
错误检查,纠错
将数据打包成段进行排序,接收方根据序号重组
具有确认机制
数据恢复、重传
流量控制(通过滑动窗口实现)
拥塞控制,慢启动、拥塞避免算法
【TCP包头】
TCP包头结构:
以4字节(32位)为一个单位,总长度为 20字节固定长度+选项可变填充字段 TCP报文最大长度为60字节
序列号:32位 4字节
确认号:32位 4字节
源端口:0-15 2字节
目标端口:16-31 2字节
数据偏移:0-3 4字节 指数据报中的数据在本报文中的起始位置,即也是表示了TCP包头的大小,数据偏移为4个字节,最大表示2^4-1=15,所以TCP最大能表示15*4=60长度的包头,选项长度和填充位可有可无,因此最小长度为20字节。
保留位:6位
URG:紧急数据
ACK:确认字段
PSH:提示接收端立即从缓冲区读走数据
RST:若收到RST=1,则表示连接出错,必须释放连接,再次重新建立连接。带RST的TCP为复位报文段
SYN:请求建立连接 SYN=1,ACK=1表示对方已经同意建立连接
FIN:通知对方本端口要关闭连接,带有FIN字段的TCP为结束报文段。
窗口大小:16-31 2字节 表示现在允许对方发送的数据量
检验和:4字节 提供额外的可靠性
紧急指针:4字节
选项:可变长度
填充:8位
MSS(Maxium Segment Size)最大报文段长度
指明自己期望对方发送TCP报文段时那个数据字段的长度。默认是536字节。数据字段的长度加上TCP首部的长度等于整TCP 报文段的长度。
窗口扩大
TCP首部的窗口大小字段长度为16位,所以其表示的最大数为65535.但是有时有较大的通信产生,如卫星通信,需要更大的窗口来满足性能和吞吐率,所以需要窗口扩大。
时间戳
可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文。
那么使用TCP协议来建立链接的时候,有个著名的过程,相信大家都很耳熟,就是TCP三次握手~~下面先来看一个容易理解的图:
上面的图可以一目了然的清楚TCP的三次握手的含义,那么我们在看一张专业的图来详细解释三次握手的过程:
看图示,首先客户端和服务器都处于CLOSED状态,这时候客户端主动打开,主动请求建立连接,给服务器发送一个带有SYN=1(请求建立连接),ACK=0(在建立连接过程中ACK唯一一次等于0的时候)seq=X(发送包的序列号)标识的包给服务器端,表示告诉服务器“嘿,我想跟你建立连接”,这时候客户端就进入了SYN-SENT状态,来等待服务器的回应;服务器端收到客户端发给它的请求,会发给客户端一个带有SYN=1,ACK=1标志的包,seq=y(表示服务器包的序列号),ack=X+1(表明上次发送的第X个包我已经收到,下一次我想要接收第X+1个包)表示同意对方的连接请求,相当于告诉客户端“我已经收到你的请求并且同意啦”,这时候服务器会进入一个SYN-RCVD状态;再看这边客户端,客户端收到了服务器的回应,表示很高兴,但是它虽然收到了,服务器并不知道它收到了自己发给服务器的回应,所以第三位握手就是由客户端再次给服务器发送一个包,表示“我已经收到了你同意我建立连接的请求”,这个过程完成以后,双方将会进入ESTAB-LISHED状态,双方已经建立连接,可以进行数据传送了。
【TCP的四次挥手】
上面我们已经建立起连接了,数据该发送的已经发完了,那我们也不能一直都连着吧,那不是浪费了网络资源吗?所以我们在完成操作以后,需要来释放两端的连接,这一过程,我们称之为TCP的四次挥手。
首先,既然双方已经建立起连接,那么双方一定都处于ESTAB-LISHED状态。那么我们假定现在是客户端要主动关闭连接(当然,二者都可以发起关闭连接请求),先由客户端给服务器发送一个带有FIN=1(通知对方本端口要关闭连接)seq=u(同样为发送包的序列号)的数据包,相当于说“嘿,我不想和你好了,我要分手”给服务器,然后客户端将进入FIN-WAIT-1的状态;服务器收到客户端发来的分手请求,会给客户端回复一个ACK=1(表示我已经收到你的消息了),seq=v(服务器端的序列号),ack=u+1(表示上个u包已经收到,下次可以发第u+1个包)给客户端,表示说“我已经确认收到你的消息”,服务器进入CLOSE-WAIT状态;客户端收到服务器的回信了,会立即进入FIN-WAIT-2状态,那为什么这次它不给服务器发消息说我已经知道了你收到我消息了呢?因为分手毕竟也是两个人的事吧,不能你说要分,我就马上放手吧,所以客户端要继续等待,等待服务器给它发送消息。果然,服务器再次发来消息,告诉客户端说“我也要和你分手”,服务器发送完以后进入一个LAST-ACK的状态;那么双方既然都达成共识了,那就分手快乐吧,所以客户端要再次给服务器发送消息说“我收到了你也要分手的消息了,那就拜拜吧”,发完这最后一句话,客户端就进入了TIME-WAIT状态;服务器接收消息后,双方就正式进入了CLOSED状态,分手快乐~
那么有人会说了,客户端发完最后一句话,为什么还要进入TIME-WAIT状态呢,而且还要等待2MSL的时间(即2个最大重传时间),因为在上一次的操作中,二者的连接还在继续,也许还有些数据正在传送,所以即使要释放连接也要等待数据传输完成,这也许就是分手也要分的体面一点吧~~~
TCP还具有其他功能:
超时重传
/proc/sys/net/ipv4/tcp_retries1 查看在底层IP接管之前TCP最少重传次数,默认为3
/proc/sys/net/ipv4/tcp_retries2 查看连接放弃前TCP最多支持重传次数,默认为15
滑动窗口:每次发送报文的个数
固定滑动窗口:窗口大小不变,固定为某一个数
TCP滑动窗口:窗口大小自适应,窗口大小根基实际情况动态调整。
拥塞控制
慢启动、拥塞控制、快重传、快速恢复
/proc/sys/net/ipv4/tcp_congestion_control 查看当前系统使用的拥塞控制算法
【UDP】
以上简单介绍了一下TCP,那么跟TCP相比起来,UDP就显得简单粗暴了很多~~
UDP是非面向连接的、不可靠的,不具备序列化的用户数据包协议。
UDP具备以下特征:
工作在传输层
提供不可靠的网络访问
非面向连接协议
有限的错误检查
传输性能高
无数据恢复特性
UDP包头结构
与TCP包头比起来,UDP的包头就显得简单多了,只分为源端口、目的端口、报文长度和检验和四部分。其定义就不再多说。
TCP和UDP只是传输层上的协议,下面再来说一个Internet层上的ARP协议(地址解析协议)。
在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。