五层协议详解
1. osi七层协议
-
简单串联每层协议以及作用
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议就理解了整个互联网通信的原理。
首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件。
接下来我们自下往上进行详细的分析。
-
物理层
物理层就是网线,交换机,路由器等一堆物理连接介质,他连接就是你的网卡。
我在这发一堆010101011110 高低高低高高高高电平他在那边会啊啊啊啊啊啊啊啊收到一堆 010101011110 ,单纯的电信号没有意义,物理层只是发一堆01010101,但是你应该对数据进行分组、划分,(类比与二进制8bit == 1bytes)这个就不是物理层干的,物理层只是发一堆0101010.
要想让二进制有真正的意义就必须对二进制进行分组,分组不是物理层做的事儿,分组是数据链路层做的事情。
-
数据链路层
数据链路层就是对这些二进制数据也就是比特流进行分组,早期的时候各个公司都有自己的分组方式,后来形成了统一的标准。对数据进行分组有什么意义?
我们都写过信么?写信除去写信的内容之外,还要注意什么?你要写寄信人,收信人的地址。网络通信同理,我们要发数据,数据从哪里来,发到哪里去?我们一定要有注明。所以数据链路层是给你的数据进行分组,
共同遵守的这个分组协议就是以太网协议ethernet 。
一组电信号为一帧,构成一个数据报,
每一组数据报分为报头和数据两部分。
head | data
head包含:(固定18个字节)
-
发送者/源地址,6个字节
-
接收者/目标地址,6个字节
-
数据类型,6个字节
data包含:(最短46字节,最长1500字节)
数据包的具体内容
head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送。
头要固定长度:为什么?这就是标准的一种体现。
发过去一帧,我会按照固定长度切出head ,data部分。先取出18个字节,再取出前六个,在取出后六个,确实是他 在读取数据。
我们知道数据链路层做的事情了,还有一个问题,写信的时候,你知道通过具体某个省市门牌号确定寄信人,发信人地址,计算机如何确定地址呢?
head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址
mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
既然有了源地址,目标地址以及数据,那么数据是如何准确的发给对方呢?
在同一个局域网中,计算机的通信方式为广播。
什么叫广播? 村里如果通知什么事情,都是村长进行全村的广播,只要他一广播,全村的每家每户都可以接收到信息。计算机都是瞎的,他是通过广播的方式。非常原始。有了以太网的标准,和广播的方式,全世界机器全部都能听见。
以我举例: 我是太白金星,数据今天晚上请我吃饭。 在班级吼出来。
然后你们找到这个包,拆包,发现不是自己,是不是就丢掉了。有了以太网和广播的方式,理论上就能实现通信。但是 我吼,你们吼不吼? 全世界都丢一份,数据量太大了。比广播风暴还要大。那么我要是吼一嗓子,通过交换机是不是能传播很多,但是不能让全世界都听到? 不切合实际,假如我把所有的交换机放到本教室,那么我通过数据发送,全世界能收到,但是这样的话,数据太大,所以有了局域网这一说:我从班里吼一嗓子,其他班能听到么?不能听到,我们班就好比一个局域网,在一个局域网之内计算机是通过广播+以太网协议进行通信的。好,那么现在 如果你一个服务端,客户端同在一个教室,通过以太网加上吼的方式能否传到,可以,这是一个局域网。但是你想在访问百度,是不是通过浏览器 客户端,访问百度这个服务端,那么你需要将百度客户端一个服务器放到你的旁边供你浏览么? 不可能。mac地址只能在局域网中用,如果跨局域网怎么办?这个就是上一层网络层做的事情了。
-
-
网络层
网络层由来:有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,这就不仅仅是效率低的问题了,这会是一种灾难
上图结论:必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),mac地址是无法区分的,它只跟厂商有关
网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址。
IP协议
IP协议就是确定对方局域网的位置(具体的我们下一节详细说明),所以:ip + mac + 广播的方式 就能让你找到全世界所有的计算机的位置。没问题吧?但是这样你就可以通信了么?没有! 互联网之间通信本质是:客户端的应用软件与服务端的应用软件的通信,只是找到计算机的位置是不够的,你应该需要找到具体的软件的位置。你的计算机上软件很多,每一个软件都有一个对应的端口用于专门收发数据的,这个端口就是下一层的事情了。
-
传输层
传输层就是TCP/UDP协议也叫做端口工作协议。这样我们就可以找到计算机具体软件的位置。
所以:现在是ip+mac+端口 就可以确定全世界任何一个计算机上的任何一个软件的位置。
-
应用层
这个协议是每个软件自定义的一些协议。
那么基本上我们就了解了以上这些协议以及每个协议具体的功能,简单的从上至下捋顺一遍。
-
-
对每层协议进行详细讲解补充
-
数据链路层
-
交换机的学习功能
我要进行数据通信,我要吼一嗓子,将我的数据包发到交换机上,然后交换机将所有的数据包都发到你们的网卡上,进行查找。找到之后拿到了数据各种拆包,然后回包。我继续进行数据通信,然后又吼一嗓子,交换机发到所有的计算机上,周而复始。这样有什么问题?交换机每次都要通过广播的方式寻找目标计算机,消耗太大了。其实针对这个问题交换机给我们提供了一个mac地址学习功能:
-
工作原理
你的计算机连接的是网口5,目标计算机连接的是网口1,你现在要给目标计算机发送数据。你要先以单播的方式发给交换机:
网口号 mac地址 网口1: FF-FF-FF-FF-FF-FF 网口2: FF-FF-FF-FF-FF-FF 网口3: FF-FF-FF-FF-FF-FF 网口4: FF-FF-FF-FF-FF-FF 网口5: FF-FF-FF-FF-FF-FF 交换机接受到你的消息之后,马上将你的网口与mac地址对应上:
网口号 mac地址 网口1: FF-FF-FF-FF-FF-FF 网口2: FF-FF-FF-FF-FF-FF 网口3: FF-FF-FF-FF-FF-FF 网口4: FF-FF-FF-FF-FF-FF 网口5: 1C-39-47-C2-9E-0F 然后交换机再以广播的方式将消息数据发送,交换机所连接的所有的计算机都会接受到消息数据,只有目标计算机会接受数据,其余的计算机发现不是找自己的全部将数据丢掉。当目标计算机进行回消息时,交换机就会将目标计算机的网口(网口1)与目标计算机的mac地址对应上。
网口号 mac地址 网口1: 1D-25-F3-43-9A-E3 网口2: FF-FF-FF-FF-FF-FF 网口3: FF-FF-FF-FF-FF-FF 网口4: FF-FF-FF-FF-FF-FF 网口5: 1C-39-47-C2-9E-0F 这样以来,以后同一个交换机下的计算机再次发送消息时,交换机先去查看此表有无记录如果可以查询到,则以单薄的形式发到目标计算机,如果没有对应则以广播的形式发送给所有计算机(不包含源计算机)。
-
-
ARP协议
ARP协议他的定位不是很明确,在osi七层模型中,ARP协议属于数据链路层,而在TCP/UDP模型中,人们往往将ARP协议归纳在网络层。我们这里主要讲的就是OSI七层模型,所以将APR协议划归到数据链路层。
ARP协议(Address Resolution Protocol)地址解析协议,根据目标IP地址获取目标物理地址的协议。
ARP协议需要分两种情况讨论:
-
同一个局域网(网段,子网)。
-
不同的局域网(网段,子网)。
本节我们先说在同一个局域网下的ARP协议是如何工作的。 上面我们说过,在同一个局域网内,计算机如何通信?计算机是通过广播的方式+以太网协议进行通信的。mac地址是计算机的物理地址,它可以确定计算机在一个局域网内的具体位置。
但是真实情是:如果两台计算机之间要想通信,如下图计算机1想将数据发送给计算机5,那么他可能不知道计算机5的mac地址,但是必须要知道计算机5的IP地址。
所以我们就得借助ARP协议,通过对方的IP地址获取到其mac地址,然后在同一个局域网内通过广播+以太网协议在进行通信。那么ARP协议的工作原理是什么呢?
例如:主机172.16.10.10 访问 172.16.10.11 前提条件:在同一个局域网。 -
-
源mac 目标mac 源ip 目标ip 源端口号 目的端口号 数据部分 1C-39-47-C2-9E-0F FF-FF-FF-FF-FF-FF 172.16.10.10 172.16.10.11 8080 10342 数据 -
计算机1会以广播的形式在局域网发送一个ARP请求:请求信息为上面显示信息(询问IP地址为172.16.10.11的计算机,告诉我172.16.10.10 你的mac地址!!)。
-
同一个局域网内的所有计算机都会接受到这个消息,当目标IP从属于的计算机接受到我的信息之后,检查发现这个信息是给我的,然后将自己的mac地址以单播的形式回给我。
其实ARP协议还有个功能,他在每个计算机都有一个ARP缓冲区,这里面有一个ARP列表:这个列表就是记录的IP地址和MAC地址的对应关系,但是这个缓存区是有生存期的,一段时间之后就会清空,如果清空了那么在重复此操作。
IP地址 MAC地址 172.16.10.11 1D-25-F3-43-9A-E3 168.16.12.36 1A-5D-B3-43-3D-5F 172.14.15.107 1B-23-A3-43-9A-6A 127.36.1.18 1B-25-E1-43-2B-4C 同一个局域网内,ARP协议真正的流程是这样: 主机172.16.10.10 访问 172.16.10.11
-
计算机1会先查询自己的ARP缓存区的ARP列表,如果有对应mac地址则直接发送数据。如果没有或者ARP列表清空了则进行下面步骤:
-
计算机1会以广播的形式在局域网发送一个ARP请求:请求信息为上面显示信息(询问IP地址为172.16.10.11的计算机,告诉我172.16.10.10 你的mac地址!!)。
-
同一个局域网内的所有计算机都会接受到这个消息,当目标IP从属于的计算机5接受到我的信息之后,检查发现这个信息是给我的,然后将自己的mac地址以单播的形式回给我。
-
-
计算机1接收到计算机5的消息之后,将对应关系补充至ARP列表,然后与计算机5开始通信。
-
-
-
网络层
-
IP协议
规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
范围0.0.0.0-255.255.255.255
一个ip地址通常写成四段十进制数,例:172.16.10.1
ip地址分成两部分
-
网络部分:标识子网
-
主机部分:标识主机
注意:单纯的ip地址段只是标识了ip地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网
例:172.16.10.1与172.16.10.2并不能确定二者处于同一子网
子网掩码
所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
比如,已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,
172.16.10.1: 10101100.00010000.00001010.00000001
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0
172.16.10.2: 10101100.00010000.00001010.00000010
255255.255.255.0:11111111.11111111.11111111.00000000
AND运算得网络地址结果:10101100.00010000.00001010.00000001->172.16.10.0
结果都是172.16.10.0,因此它们在同一个子网络。
总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
-
-
-
传输层
传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序,那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。
传输层功能:建立端口到端口的通信
补充:端口范围0-65535,0-1023为系统占用端口
传输层也有协议叫‘端口’协议,这两个协议包含两种:UDP协议,TCP协议,下面我们会详细讨论。
-
应用层:
应用层由来:用户使用的都是应用程序,均工作于应用层,互联网是开放的,大家都可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式
应用层功能:
-
选择一个合适的网络应用体系结构;
-
根据所选的网络应用体系结构,确定客户进程和服务器进程;
-
确定客户进程和服务器进程的端口号;
-
确定客户进程和服务器进程的IP地址;
-
选择一个合适的应用层协议;
-
考虑网络应用所需的服务。
从上面我们可以得知应用层要获取客户端服务端的端口号以及ip协议,还有就是选择一个合适的应用层协议,封装我的数据,目前存在的应用层协议有:
DNS,FTP,HTTP,telnet,HTTP,SMTP,POP3,SNMP等。
我们使用的应用程序都会根据其本身的性质选择其中的某个协议作为传输数据的规范。
举个例子比如FTP协议,FTP协议就是文件传输协议,FTP是因特网上使用得最广泛的文件传送协议。FTP提供交互式的访问,允许客户指明文件类型与格式,并允许文件具有存取权限。
比如我们利用百度云盘上传一个文件,文件读取出来就是一堆二进制的数据,它不只是上传一堆这样的二进制数据,我们上传文件时肯定需要验证文件的完整性,获取源文件名,获取源文件的大小等,所以我们假如file_content代表文件的内容,我们应用程序可以按照一定规范对其进行加工:
原本我们只需要上传file_content数据即可,现在我们要上传一个字典:
dic = { "md5": 'ec623e4013d9e87a367ea086b8392563', "filename": '太白金星.md', "file_size": 7676565, "file_content": file_content, }
这样百度云盘接受到我的数据之后,就可以获取到相应的数据信息了。
-
-
小结:
现在你的计算机A想要向一个计算机B发送数据,你需要知道什么信息?
-
应用层获取你的IP地址(包含子网掩码)、端口,和对方的IP地址(包含子网掩码)、端口。
-
通过ARP协议拿到对方的mac地址(无论在不在同一个局域网都可以)。
-
通过对方的IP地址和子网掩码去判断,计算机A与计算机B是否在同一个局域网。
-
如果是在同一个局域网则通过广播+以太网协议找到计算机B的位置,然后在通过端口号确定软件的位置,从而进行通信。
-
如果不是在同一个局域网怎么办?
那你就将数据传给路由器就行了,路由器遵从路由协议通过对方的IP地址(包含子网掩码)确定对方的网段,将数据发送到目标计算机从属于的路由器上然后通过广播+以太网协议最终发送到目标计算机,最后通过端口传输到目标软件上。
-
这只是一个简单的描述,下一节会给大家做一个详细的过程分析。
所以说,我要通过计算机A给计算机B发送数据,只要知道对方的IP地址和端口(mac地址会通过ARP协议自动获取)即可,也就是说,IP地址+端口就可以定位世界上任意一台计算机上的目标软件。
-
-
2.TCP,UDP协议
由于tcp协议与udp协议比较重要,我们单独的把传输层的两个协议拿出来进行详细的说明。
-
UDP协议
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,它是不可靠的无连接协议,面相数据报,相对不安全,但是他的传输效率高,尽最大努力服务,无拥塞控制。一般用于即时通信:qq聊天,微信,在线视频,网络语音电话,对数据准确性和丢包要求比较低,但是速度必须快。
”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
以太网头 ip头 udp头 数据 -
TCP协议
TCP协议是Transmission Control Protocol的简称,中文名是传输控制协议,它是可靠的面相连接的流式协议。相对安全,但是传输效率相对低,一般用于文件传输,发送或者接受邮件,远程登录等等。
可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。总长度也是不超过65535字节。
以太网头 ip头 TCP头 数据 IP数据报就是一个抽象概念,是对数据包的结构进行分析,由首部和数据两部分组成,总长度不超过65535个字节。
tcp报文
3.TCP协议的三次握手、四次挥手
比如客户端与服务端基于TCP协议这种面相连接的网络通信,通过OSI七层模型的层层封装,然后广播、在通过ARP协议获取mac地址,经由路由协议终于找到了计算机B对应的软件上,这就好比唐僧师徒四人经历九九八十一最终取得真经一样,如果每次通信都是这么艰辛,不仅效率低,而且各个硬件设备处理的事务重复繁琐,产生的内耗是巨大的。所以如果让我们去设计网络通信的方式应该怎么去做?
比如,如果回到没有导航的年代,我想跑保定到济南的运输线,你怎么做? 第一次的时候,你应该参考纸质版地图,经过路标等提示信息、沿路的询问最终到达济南。那么下一次你在从保定跑济南,你还用这么麻烦么? 最优路线你已经记住了,下一次你就直接按照上一次走的路线送货就可以了。
所以,我们网络通信也是基于这个原理,当客户端与服务端第一次建立链接时,他先要建立最优路线的专属管道,管道建立完毕之后,我的客户端想要给服务端发送消息了,直接将数据向管道一丢,数据就会顺着管道传输到服务端上,非常的快速方便。同理,服务端要想与客户端回消息,也一定要先建立最优路线的专属管道,消息顺着管道就会快速的到达客户端,这样省去了每次发送数据不必要的操作,重复的工作,提高了效率。
-
TCP协议的三次握手
所以客户端要与服务端通信之前,先要建立链接,两条通道修好之后,两边各自在利用通道收发消息,方便快捷。那么TCP协议第一次建立链接需要经历三次握手。
-
思路:
这是几次握手?哪来的三次握手呢?这不是四次握手么?对,建立链接时理应是四次握手,但是这里的2、3次握手是可以整合到一起的,服务端可以发送一个回应既包含同意客户端与我建立链接,又包含我也向客户端建立链接的申请。
-
规范版本:
图解:
SYN就是请求,seq是一个随机的序列号。
第一次握手:客户端发送SYN=1 随机序列号seq到服务端,服务端接受到消息。
第二次握手:客户端回一个ack=1+x,并且也发送了一个SYN=1,随机序列号seq=y,这个说明服务端同意了(客户端到服务端的通道建立完毕),并且服务端也给客户端发送了一个建立通道的请求。
第三次握手:客户端接受到消息之后,回复了一个ack=1+y,消息到达服务端(服务端到客户端的通道建立完毕)。
至此两条通道建立完毕,接下来客户端与服务端就可以沿着两条通道互相收发消息了。
-
-
TCP协议的四次挥手
当客户端向服务端消息发送完毕,应该将通道关闭(通道一直开启会占用资源),此时就涉及到了TCP协议断开链接的四次挥手。
-
思路:
为什么断开链接需要四次挥手呢?2、3整合成一次不行么?(面试题经常会问到)
这个与建立链接时不太一样,客户端向服务端发起断开链接的请求时,证明客户端已经向服务端数据发送完毕了,所以我请求断开链接,但是此时服务端向客户端端发送的数据完成与否不确定,服务端需要等待向客户端发送的数据全部完成之后,才可以发起断开链接的请求,所以不能整合到一起。
-
规范版本:
-
图解:
第一次挥手:客户端向服务端的数据发送完毕之后,会向服务端发送一个FIN=1 seq=u的请求,服务端接受到这个请求。
第二次挥手:服务端接受到这个请求之后,会向客户端发送一个ack=1+u的请求,同意客户端断开链接,客户端接受到这个请求,断开了通往服务端的通道。
第三次挥手:服务端向客户端的数据发送完毕之后,会向客户端发送一个FIN=1 seq=w的请求,客户端接受到这个请求。
第四次挥手:客户端接受到这个请求之后,会向服务端发送一个ack=1+w的请求,同意服务端断开链接,服务端接受到这个请求,断开了通往客户端的通道。
相关面试题:
-
为什么断开链接需要四次挥手呢?
这个与建立链接时不太一样,客户端向服务端发起断开链接的请求时,证明客户端已经向服务端数据发送完毕了,所以我请求断开链接,但是此时服务端向客户端端发送的数据完成与否不确定,服务端需要等待向客户端发送的数据全部完成之后,才可以发起断开链接的请求,所以不能整合到一起。
-
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
-
什么是SYN洪水攻击?
TCP协议也称为"好人"协议,什么叫好人?因为TCP协议不会拒绝任何客户端来链接我,只有我客户端来链接我,我就给他回一个ack然后向客户端发送SYN请求,等待客户端同意,在客户端没有同意之前,服务器会维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
SYN洪水攻击:利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源,配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
-