OSI(Open System Interconnect)开放系统互联参考模型-7层模型

时间:2024-11-14 07:35:51

一,OSI七层模型

1.物理层--物理介质(双绞线/光纤)/比特流

2.数据链路层--MAC地址/字节流(帧)

3.网络层--ARP(address resolution protocol)/IP/路由协议(动态,静态)

4.传输层--TCP/UDP/端口

5.会话层--断点校验续传,点重传/自动收发

6.表示层--不同系统之间通信编译,工作,提供公共语言

7.应用层--定义了各种应用协议规范数据格式:http,https,ftp,smtp,dns

二,TCP/IP四层协议

1.网络接口层--物理层/数据链路层 --Ethernet

2.网络层--网络层--IP/ARP(地址解析协议,通过IP查找MAC地址)

3.传输层--传输层--TCP/UDP

4.应用层--会话层/表示层/应用层--HTTP/HTTPS/FTP/SMTP

三.数据传输过程

MTU(Maximum Transmission Unit最大传输单元)是在IP层下面的MAC协议中的概念,MAC协议我们可以理解为是物理层的一些协议,它位于IP协议的下层,那么在发送数据时相当于是用户数据 + 应用层协议报头(如HTTP请求报头)作为有效载荷交给传输层(如TCP协议),TCP协议再将TCP报头 + 应用层传来的数据下交给IP层,IP层再将IP协议首部 + TCP层传来的TCP报文交付给MAC帧。因此每个MAC帧其实是IP协议首部 + IP层的有效载荷。而MAC帧是有长度限制的,所以就要求IP数据报向下交付时并不是随心所欲想发多长就发多长,如果MAC帧要求MTU为1500字节,而IP数据包总长度有2000字节,那么就需要分片,将原有的IP数据包分成两片,依次发送,对端的主机在接收后,由对端的IP层再完成组装。我们在Linux环境下可以使用ifconfig命令查看到MTU。

 传输过程:

1.应用层--data

2.传输层--封装-TCP头部(端口)+data

3.网络层--封装-IP头部(源IP,目的IP)+TCP头部(端口)+data

4.数据链路层--封装-MAC头部(源MAC,目的MAC)+IP头部(源IP,目的IP)+TCP头部(端口)+data

5.物理层--“MAC头部(源MAC,目的MAC)+IP头部(源IP,目的IP)+TCP头部(端口)+data”转换为比特流

==数据传输==

1.服务器物理层--解析比特流,重组,分组

2.数据链路层--拆分以太帧,获取到MAC地址,得到数据“IP头部(源IP,目的IP)+TCP头部(端口)+data”

3.网络层--解析IP头部,得到”TCP头部(端口)+data“

4.传输层--解析TCP头部,得到数据

5.应用层--解析数据

四.协议

(address resolution protocol,地址解析协议)-网络层

1.1寻址流程图

 1.2寻址流程

1.2.1 arp -a查看本机网卡及学习地址信息

接口: 192.168.1.106 --- 0x5
  Internet 地址         物理地址              类型
  192.168.1.1           d0-76-e7-b8-f7-38     动态
  192.168.1.255         ff-ff-ff-ff-ff-ff     静态
  224.0.0.22            01-00-5e-00-00-16     静态
  224.0.0.251           01-00-5e-00-00-fb     静态
  224.0.0.252           01-00-5e-00-00-fc     静态
  239.255.255.250       01-00-5e-7f-ff-fa     静态
  255.255.255.255       ff-ff-ff-ff-ff-ff     静态

 1.2.2 ping 192.168.1.103,借助(wireshark,寻址103)

 通过ping 103,发现已得到响应

1.2.3 再次通过arp -a 查看发现已经学习到192.168.1.103信息

(Internet Protocol)网际协议 - 网络层

2.1 如果想要在互联网这个共享网络中精确定位到一台主机,那么就一定需要该主机的IP地址。主机是拥有IP地址,但是不能进行路由控制(Routing,意思是中转、分组数据包),路由器(Router)这种设备既有IP地址,又可以进行路由控制;我们可以将接入互联网中的主机和路由器都叫做节点。

2.2 寻址流程图

2.3 IP协议首部格式(IPV4)

1)4位版本号(Version):用来指定IP协议的版本,IPV4的版本号就是4,如果这个IP报文是IPV4版本,那么这个字段的值就是4,用4位来标识就是0100。IPV6的版本号则是6。
2)4位首部长度(Internet Header Length):表明IP首部的大小,单位是4个字节,length * 4的字节数,因为这一字段共4个比特位,所以这一字段最大值为2 ^ 4 - 1即15,所以IP首部最大长度为15 * 4即60字节;在默认情况下,该字段被设置为5,所以默认IP首部20字节。
3)8位服务类型(Type Of Service):前三位表示优先度(已经弃用),第4位表示最低延迟、第5位表示最大吞吐、第6位表示最大可靠性、第7位表示最小代价,这四位互相冲突,只能选择一个。需要根据不同情况进行选择,如果是SSH/TELNET这类远端登录,那么就应该选择最低延迟,如果是FTP类型的程序,则应该选择最大吞吐量;第8位是保留位,目前没有使用,必须填0。
4)16位总长度(Total Length):表示IP首部和后面携带的数据部分一共有多少个字节。该字段有16个比特位,因此IP数据报整体最大长度为65535个字节。
5)16位标识(ID):唯一地标识主机发送的报文,如果一份IP报文在数据链路层被分片,那么每一片的该字段应该都是相同值。帮助对端主机在接收后进行分片重组。
6)3位标志(Flag):第一位保留(保留的意思是现在不使用,未来如果需要的话再使用),必须填0;第二位用来指明是否可以分片,如果为0则可以分片,如果为1则不能分片,假如一个IP报文禁止分片且长度还大于了MTU(Maximum Transmission Unit最大传输单元),则该本文只能被丢弃;如果报文被分片,第三位为1表示它是分片中段的报文,即后续还有分片报文,如果第三位为0则表示这是最后一片。
7)13位片偏移(Fragment Offset):该字段表示分片相对于原始IP报文开始处的偏移量,其实就是表示当前分片在原报文中所处的位置,第一个分片对应值为0。由于该字段总共13个比特位,因此最多可以表示2 ^ 13即8192个相对位置。单位为8字节,所以最大可以表示8192 * 8 = 65536个字节的位置。
8)8位生存时间(Time To Live):数据报到达目的地的最大报文跳数(Hop,指网络中一个区间,IP数据包正是在网络中一个跳间被转发),一般为64,每次经过一个路由,TTL–1,如果TTL == 0时还没到达目的地,那么这个报文就会被丢弃。这个字段主要是为了防止出现路由循环,数据包在一个循环中一直转发,浪费网络资源。
9)8位协议(Protocol):表示IP的上层是什么协议,我们熟知的TCP、UDP、ICMP等都是在IP上层的。
10)16位首部校验和(Header Checksum):使用CRC进行校验,鉴别IP首部是否收到损坏,如果损坏直接丢弃,它只校验IP头部,不校验下面的内容,因为内容部分的校验是上层传输层(TCP)需要考虑的,IP协议只要发现首部有问题就直接丢弃该报文。
11)32位源IP地址(Source Address):表示发送端的IP。
12)32位目的IP地址(Destination Address):表示接收端的IP。
13)选项字段(Options):不定长,最大可以到40个字节。

2.4 IP地址
2.4.1 IP地址的定义:

IPV4中我们由32位正整数来表示IP地址,计算机内部会直接以二进制来保存IP地址,不过人并不善于记忆二进制整数,所以我们采用点分十进制来记录IP地址:即将32位IP地址每8位一组,分成4组,组间用’ . '进行分隔,再将每组转换为十进制。

因此我们可以直接算出,在IPV4标准下最多有2 ^ 32 = 4292967296个IP地址,但是能被人们使用的远远不足这个数字。(比如某些IP地址是有特殊作用被预留的,某些设备如路由器会占有多个IP地址)

2.4.2 IP地址的组成:

IP地址由网络标识(网络地址)和主机标识(主机地址)两部分组成。

我们查找到一个IP地址的过程就像是去某个地方旅游一样,例如我们想要去*玩,不可能直接坐高铁到达*,我们一定是先抵达北京市(目的网络),再通过北京市内的交通抵达*(目的主机)。因此我们在路由选择时,应该先找到目标主机所在的局域网,再在该局域网中找到目标主机。这种方式可以快速帮我们定位到目标局域网,在局域网内搜索目标主机就比在茫茫的网络中找一台主机要快速多了。

网络号:保证互相连接的两个网段具有不同的标识。

主机号:保证在同一个网段中,两台主机具有不同的标识。
2.4.3 IP地址的划分:

IP地址划分为五个级别,分别为A类、B类、C类、D类和E类(一直没有使用过),所以目前我们所能见到的IP地址只有A、B、C、D四类。划分的依据就是IP地址从第1位到第4位的比特位。

A类地址:0.0.0.0 ~ 127.255.255.255
B类地址:128.0.0.0 ~ 191.255.255.255
C类地址:192.0.0.0 ~ 223.255.255.255
D类地址:224.0.0.0 ~ 239.255.255.255
E类地址:240.0.0.0 ~ 247.255.255.255

2.4.4 引入子网掩码:

随着Internet的发展,使用前四位是否为1来分类的方案弊端开始显现:那就是很多子网的申请者都会去申请B类网络地址,因为A类根本用不完,而C类不够用。导致B类的网络地址很快就被分配完了。而申请了A类的网络又会浪费大量的IP地址,在这种情况下,人们提出了新的划分方案:CIDR(Classless Interdomain Routing无类型域间选路)

    引入子网掩码来区分网络号和主机号
    子网掩码也是一个32位的正整数,但结尾通常是一串0
    将IP地址与子网掩码进行&操作,所得结果就是网络号
    网络号和主机号的划分就与这个IP地址是A类、B类还是C类无关了

举两个例子帮助理解通过子网掩码来划分网络号和主机号
例一:
IP地址    二进制表达
140.252.20.68    1000 1100 1111 1100 0001 0100 0100 0100
子网掩码    二进制表达
255.255.255.0    1111 1111 1111 1111 1111 1111 0000 0000

按位与后的网络号

140.252.20.0     1000 1100 1111 1100 0001 0100 0000 0000   

将IP地址与子网掩码进行按位与操作后得到1000 1100 1111 1100 0001 0100 0000 0000,再转化为方便人们使用的点分十进制为140.252.20.0,这就是该子网的网络号了。并且它的子网掩码末尾的8个比特位为0,这个子网可以表示2 ^ 8 = 256台主机,因此这个子网的地址范围是140.252.20.0 ~ 140.252.20.255
2.4.5 一些特殊的IP地址

    将IP地址中的主机地址全设置为0,即该局域网的网络号,这个IP地址代表这个局域网。
    将IP地址中的主机地址全设置为1,可以变成广播地址,这个广播地址可以给同一个链路中互相连接的所有主机发送数据包
    127.*的IP地址用于本地环回测试,通常是127.0.0.1,测试本机网络配置,能ping通则说明本机的IP协议安装没问题

(Transmission Control Protocol,传输控制协议)- 传输层

3.1 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议    

3.2 特点:

(1)基于流的方式;

(2)面向连接;(在通信之前要通过三次握手建立链接)

(3)可靠通信方式;(确保数据不会丢失)

(4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;(拥塞控制)

(5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。

因为有着拥塞控制和可靠数据传输的要求所以导致了TCP协议的传输效率相对于UDP要低,但是不会像UDP一样出现丢包现象。

3.3 TCP协议的报文格式

TCP头部有20个固定字节,选项部分长度不定,最多40个字节。

(1)源端口和目的端口:各占2个字节。端口是指传输层和应用层的服务端口。传输层的分用和复用就是通过端口实现的。

分用:在发送端,多个客户端进程公用一个传输层。

复用:在接收端,传输层会根据端口号分配给不同的应用进程。

(2)序号字段:占4个字节。范围是0—2^32-1。因为TCP是面向字节流,所以它为每一个字节进行编号。

(3)确认号:占4个字节,是期望收到下一个报文段的数据部分的第一个序号。

(4)数据偏移:占4个字节。是指TCP报文段的数据开始的部分距TCP报文段起始部分的偏移量。

(5)保留字段:占6个字节。

(6)标识符:

URG:当URG置1时,表示紧急指针有效,它告诉系统此报文段有紧急数据,应尽快传送。

ACK:ACK置1,表示确认号字段才有效。此外,TCP规定,建立连接后,传输的所有报文段的ACK都需要被置1.

PSH:当接收者收到PSH=1时,会立即把数据传输给应用程序,而不会等到缓冲区满了,再做提交。

RST:RST=1,表示TCP连接出现了严重的问题,必须释放重连。

SYN:建立连接的时候使用。

        当SYN=1,ACK=0时,表示为请求连接。

        当SYN=1,ACK=1时,表示为同意连接的请求应答。

FIN:FIN=1,表示请求释放连接。

(7)窗口:占2个字节,表示接受端的接收窗口的大小。用于实现流量控制。将接收端发送过去的窗口大小设置成发送端的发送窗口大小,从而控制了发送端的发送效率。

(8)校验和:用于检测发送过程中是否出现错误。

(9)紧急指针:用于标识紧急数据的尾部。

(10)选项字段:(需要掌握的几个选项)MMS—最大报文长度,实际是报文段的最大数据长度。窗口扩大因子。时间戳选项。

3.4 TCP建立连接需要三次握手,断开连接需要四次挥手,三次握手

(1)第一次握手:Client进入SYN_SENT状态,发送一个SYN帧来主动打开传输通道,该帧的SYN标志位被设置为1,同时会带上Client分配好的SN序列号,该SN是根据时间产生的一个随机值,通常情况下每间隔4ms会加1。除此之外,SYN帧还会带一个MSS(最大报文段长度)可选项的值,表示客户端发送出去的最大数据块的长度。

(2)第二次握手:Server端在收到SYN帧之后,会进入SYN_RCVD状态,同时返回SYN+ACK帧给Client,主要目的在于通知Client,Server端已经收到SYN消息,现在需要进行确认。Server端发出的SYN+ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment
Number)值被设置为Client的SN+1;SYN+ACK帧的SYN标志位被设置为1,SN值为Server端生成的SN序号;SYN+ACK帧的MSS(最大报文段长度)表示的是Server端的最大数据块长度。

(3)第三次握手:Client在收到Server的第二次握手SYN+ACK确认帧之后,首先将自己的状态会从SYN_SENT变成ESTABLISHED,表示自己方向的连接通道已经建立成功,Client可以发送数据给Server端了。然后,Client发ACK帧给Server端,该ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment
Number)值被设置为Server端的SN序列号+1。还有一种情况,Client可能会将ACK帧和第一帧要发送的数据,合并到一起发送给Server端。

(4)Server端在收到Client的ACK帧之后,会从SYN_RCVD状态会进入ESTABLISHED状态,至此,Server方向的通道连接建立成功,Server可以发送数据给Client,TCP的全双工连接建立完成。

Client和Server完成了三次握手后,双方就进入了数据传输的阶段。数据传输完成后,连接将断开,连接断开的过程需要经历四次挥手。

3.5 四次挥手

(1)第一次挥手:主动断开方(可以是客户端,也可以是服务器端),向对方发送一个FIN结束请求报文,此报文的FIN位被设置为1,并且正确设置Sequence
Number(序列号)和Acknowledgment
Number(确认号)。发送完成后,主动断开方进入FIN_WAIT_1状态,这表示主动断开方没有业务数据要发送给对方,准备关闭SOCKET连接了。

(2)第二次挥手:正常情况下,在收到了主动断开方发送的FIN断开请求报文后,被动断开方会发送一个ACK响应报文,报文的Acknowledgment
Number(确认号)值为断开请求报文的Sequence Number
(序列号)加1,该ACK确认报文的含义是:“我同意你的连接断开请求”。之后,被动断开方就进入了CLOSE-WAIT(关闭等待)状态,TCP协议服务会通知高层的应用进程,对方向本地方向的连接已经关闭,对方已经没有数据要发送了,若本地还要发送数据给对方,对方依然会接受。被动断开方的CLOSE-WAIT(关闭等待)还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

主动断开方在收到了ACK报文后,由FIN_WAIT_1转换成FIN_WAIT_2状态。

(3)第三次挥手:在发送完成ACK报文后,被动断开方还可以继续完成业务数据的发送,待剩余数据发送完成后,或者CLOSE-WAIT(关闭等待)截止后,被动断开方会向主动断开方发送一个FIN+ACK结束响应报文,表示被动断开方的数据都发送完了,然后,被动断开方进入LAST_ACK状态。

(4)第四次挥手:主动断开方收在到FIN+ACK断开响应报文后,还需要进行最后的确认,向被动断开方发送一个ACK确认报文,然后,自己就进入TIME_WAIT状态,等待超时后最终关闭连接。处于TIME_WAIT状态的主动断开方,在等待完成2MSL的时间后,如果期间没有收到其他报文,则证明对方已正常关闭,主动断开方的连接最终关闭。

被动断开方在收到主动断开方的最后的ACK报文以后,最终关闭了连接

处于TIME_WAIT状态的主动断开方,在等待完成2MSL的时间后,才真正关闭连接通道,其等待的时间为什么是2MSL呢?

2MSL翻译过来就是两倍的MSL。MSL全称为Maximum Segment
Lifetime,指的是一个TCP报文片段在网络中最大的存活时间,具体来说,2MSL对应于一次消息的来回(一个发送和一个回复)所需的最大时间。如果直到2MSL,主动断开方都没有再一次收到对方的报文(如FIN报文),则可以推断ACK已经被对方成功接收,此时,主动断开方将最终结束自己的TCP连接。所以,TCP的TIME_WAIT状态也称为2MSL等待状态。

有关MSL的具体的时间长度,在RFC1122协议中推荐为2分钟。在SICS(瑞典计算机科学院)开发的一个小型开源的TCP/IP协议栈——LwIP开源协议栈中MSL默认为1分钟。在源自Berkeley的TCP协议栈实现中MSL默认长度为30秒。总体来说,TIME_WAIT(2MSL)等待状态的时间长度,一般维持在1-4分钟之间。

通过三次握手建立连接和四次挥手拆除连接,一次TCP的连接建立及拆除,至少进行7次通信,可见其成本是很高的

4. UDP (User Datagram Protocol)用户数据报协议,提供面向事务的简单不可靠信息传送服务

4.1 UDP的主要特点是:
(1)UDP 是无连接的。即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
(2)UDP 使用尽最大努力交付。即不保证可靠交付,因此主机不需要维护复杂的连接状态表(这里面有许多参数)。
(3)UDP 是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不分拆,而是保留这些报文的边界。这就是说,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文,如图 5-4 所示。在接收方的 UDP,对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程。也就是说,UDP 一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。若报文太长,UDP 把它交给 IP 层后,IP 层在传送时可能要进行分片处理,这会降低 IP 层的效率。反之,若报文太短,UDP 把它交给 IP 层后,会使 IP 数据报的首部的相对长度太大,这也降低了 IP 层的效率。
(4)UDP 没有拥塞控制。因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很多的实时应用(如:IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络出现拥塞时丢失一部分数据,但却不允许数据有太大的时延。UDP 协议正好适合这种要求。
(5)UDP 支持一对一、一对多、多对一和多对多的交互通信。
(6)UDP的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。

虽然某些实时应用需要使用没有拥塞控制的 UDP,但当很多的源主机同时都向网络发送高速率的视频流时,网络就有可能发生拥塞,结果大家都无法正常接收。因此,不使用拥塞控制功能的 UDP 有可能会引起网络发生严重的拥塞问题。还有一些使用 UDP 的实时应用,需要对 UDP 的不可靠的传输进行适当的改进,以减少数据的丢失。在这种情况下,应用进程本身可以在不影响应用实时性的前提下,增加一些可靠性的措施,如采用前向纠错或重传已丢失的报文。

4.2 UDP首部格式

用户数据报 UDP 有两个部分组成:首部 + 数据部分。首部部分很简单,只有 8 个字节,由四个字段组成,每个字段的长度都是两个字节。各字段含义如下:

(1)源端口:源端口号。在需要对方回信时选用。不需要使用时可用 0 填充。

(2)目的端口:目的端口号。这在终点交付报文时必须使用。

(3)长度:UDP 用户数据报的长度,其最小值是 8(即仅有首部部分),单位:字节。

(4)校验和:检测 UDP 用户数据报在传输过程中是否出错。有错就丢弃。

 如果接收方 UDP 发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 IGMP(Internet Group Management Protocol) 发送 “端口不可达” 差错报文给发送方。
请注意,虽然 在 UDP 之间的通信要用到其端口号,但由于 UDP 之间的通信是无连接的,因此不需要使用套接字socket(TCP 之间的通信必须要在两个套接字之间建立连接)

4.3 传输模型

 4.4 TCP VS UDP