
TCP-IP网络模型
TCP/IP 网络模型
根据我国互联网络信息中心发布的第 47 次《中国互联网络发展状况统计报告》显示,截至 2020 年 12 月,我国网民人数已达 9.89 亿。而这 9.89 亿的人群中根据著名的二八定律,在互联网上活跃且具有消费能力的占其中 20%,也就是 1.978 亿人,这些人构成了互联网的主力,促进互联网的发展。
中国整体正在进行产业升级,由原来的 Made In China 中国制造,正在转型中国服务,我们正在从一个制造业社会,转变成服务业为主的社会。各种各样的服务行业成为 GDP 贡献的主力军,而服务业太适合在互联网上发展,抖音短视频的爆火就是一个案例,一个产业要想活下去,就必须要盈利,而抖音带来了新的盈利模式,不再是单单的直播或者视频创作,它带来了直播带货,广告,曝光量等等一系列的新的盈利模式,没错,就是用服务来盈利,而其中最赚钱的渠道莫过于广告,抖音最大的资金来源正是营销,我们接触到的各个行业都有营销,而抖音在互联网行业中将营销做到了极致。
那么抖音为什么可以用营销来盈利?正是因为其庞大的用户量,以及极高的用户粘性,日活跃用户超 4 亿的抖音单单凭借用户基数就可以成为营销渠道最好的平台。计算一下,假若你可以在抖音首页投放一条广告,根据二八定律,一天有 8000 万人点击查看,160 万人下载,最终 32 万人成为了忠实用户,那么你的平台也可以投放广告了,找投资,这就是互联网现今盈利的模式之一。
而面对如此巨大的用户量,带来的是极其庞大的访问量和并发量,抖音等互联网大厂是怎么处理的?这里就绕不开计算机网络,而谈到计算机网络就不得不提 TCP/IP 协议。
OSI 参考模型
为了更好地促进互联网络的研究和发展,国际标准化组织 ISO 制定了网络互连的七层框架的一个参考模型,称为开放系统互连参考模型,简称 OSI/RM(Open System Internetwork Reference Model)。
OSI 参考模型是一个具有 7 层协议结构的开放系统互连模型
,是由国际标准化组织在 20 世纪 80 年代早期制定的一套普遍适用的规范集合,使全球范围的计算机可进行开放式通信。 发送和接收信息所涉及的内容和相应的设备称为实体。每一层都包含多个实体,处于同一层的实体称为对等实体。
OSI 参考模型也采用了分层结构技术,把一个网络系统分成若干层,每一层都去实现不同的功能,每一层的功能都以协议形式正规描述,协议定义了某层同远方一个对等层通信所使用的一套规则和约定。每一层向相邻上层提供一套确定的服务,并且使用与之相邻的下层所提供的服务。从概念上来讲,每一层都与一个远方对等层通信,但实际上该层所产生的协议信息单元是借助于相邻下层所提供的服务传送的。因此,对等层之间的通信称为虚拟通信。
上述是百度百科对 OSI 参考模型的解释,简单点说,其目的就是为了 分层解耦,这也是软件工程的精髓。

可以看到这七层,包含了大量的协议,为了理解这七层的作用,以及数据是如何通过这七层传输到指定服务器进行数据访问,我们就用你请求www.bibilailai.com 来贯穿整个传输过程。
在你用浏览器访问 www.bibilailai.com 的时候,如果让你来架构,你要怎么做?
首先,你肯定得知道你要去哪?
怎么去?是坐火车,动车,高铁还是飞机?
决定好了就得买票,如果步行,算你🐂🍺。
这就是最简单的解决方式了吧,那么其实在互联网里数据传输大致也是一样的。
应用层
而 HTTP 协议就是用来解决这个问题的,我们告诉浏览器我们要去 www.bibilailai.com 访问其主页,用的是 edge 浏览器,那么电脑是怎么解决的呢?
在浏览器输入 www.bibilailai.com 的时候,浏览器肯定不认识这个东西,这个东西也没有个类似身份证什么的,而且我们出去旅游都还得用地图,更何况浏览器呢。这里就牵扯到了 DNS(域名系统 Domain Name System),你可以将它理解为一张表,键是域名,值是对应的 IP 地址,因为 IP 是数字太难记了,域名的出现是为了好记忆,跟我们手机的通讯录是一个道理。
HTTP 协议
上述测试连接成功后,就会开始传输数据,其实三次握手中的第三次就已经传输了数据。我们确认了服务方在家而且方便,那么就是要告诉他我们要做什么?但是假若对方是个外国友人,我们就要定制一套翻译的体系的规范,而这里的 HTTP 协议就类似于一套体制,为客户端终端(用户)和服务器端(网站)请求和应答定制一个标准。
HTTP 协议定义 Web 客户端如何从 Web 服务器请求 Web 页面,以及服务器如何把 Web 页面传送给客户端。HTTP 协议采用了请求 / 响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP 协议有以下几个特点:
简单快速:客户向服务器请求服务,只需传送请求方法和路径。请求方法常用的有 GET HEAD POST , 每种方法规定了客户与服务器联系的类型不同,由于 HTTP 协议简单,是的 HTTP 服务器规模小,通信速度快。
灵活 :HTTP 协议允许传输任意类型的数据对象,正在传输的数据类型由 Content-Type 加以标记。
无连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并受到客户的应答后,就追截断开连接,这样可以节省传输时间,但是现在的 HTTP1.1 不是直接就断开了,而是等几秒钟,等着用户后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的。
无状态:HTTP 是一种不保存状态 , 即无状态(stateless)协议。HTTP 协议 自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。使用 HTTP 协议 , 每当有新的请求发送时 , 就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成 如此简单的。可是,随着 Web 的不断发展,因无状态而导致业务处理变得棘手的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。
现在我们收拾好了,请求也准备好了,就可以发送请求了,请求经过 HTTP 协议封装后,现在的请求为 HTTP 请求报文,然后将 HTTP 请求报文扔往运输层进行处理。
传输层

这张图大致就是 TCP 报文格式,HTTP 请求报文到达之后,TCP 将 HTTP 封装过的数据再次进行封装,加上属于 TCP 协议的头部信息。
我们现在已经拿到了 IP 地址,那是不是就可以去访问数据了呢?我们都知道肯定不行,还得三次握手建立连接呢。
但是为什么呢?假设你要去你朋友家找他 play,你是直接去找吗?还是说打个招呼,问问别人方便吗,或者人在家里吗。如果人家不方便或者不在家,你岂不是白跑一趟,三次握手就是用来解决这个问题的。
三次握手

那么为什么是三次握手呢?不是四次或者两次?
解释一下三次握手都做了什么?等等,这些问题是不是很眼熟?被问烂的面试题。
转载于 mengweiping:三次握手,为什么不是两次,也不是四次
TCP 三次握手是为了建立一个网络连接,进而进行数据传输。TCP 通过三次握手,建立了连接,告诉了客户端和服务器自己和对方的发送数据和传输数据的能力。这个过程可以类比于两个小朋友隔着一堵墙玩丢沙包游戏。

有两个小朋友,一个叫小客(客户端), 一个叫小服(服务器),他们从来没有玩过丢沙包游戏,突然间他们心血来潮,想玩丢沙包,但他们隔着一堵墙,他们该怎么确定两个人能不能玩成这个游戏呢?
他们需要确定自己会不会扔沙包和接沙包,还需要确定对方会不会扔沙包和接沙包。等两边都确定了自己和对方的都具有接收能力后,他们就可以快乐的在一起玩丢沙包游戏了。
那么怎么样确定自己和对方有没有接收能力呢,他们需要经过如下步骤:
1、小客把沙包扔到墙的另一边给小服,小服接到沙包后就立即知道了一件事情,小客会扔沙包,而自己会接沙包

2、接着小服把沙包再扔给小客,小客接到沙包

这时候小客就知道了小服会接沙包,也会扔沙包,而自己既会扔沙包,也会接沙包。小客已经充分知道了对方和自己的实力,他们都会扔沙包和接沙包,可以玩成丢沙包的游戏。
但此时小服那里还有疑问,我只接到了小客的沙包,我扔出去的沙包小客会不会接到呢,对方有没有接沙包的实力呢,万一对方眼神有问题呢,他只会扔,不会接咋办,那我和他玩啥呀。
3、正在小服犯嘀咕的时候,小客把沙发丢回来了

小服高兴了,对方能把沙包丢回来,证明对方会接沙包,眼神没问题, 我们俩能玩的起来。这样小服这边就完全知道了小客和自己接收沙包的能力,于是俩人就可以嗨皮的玩了起来。
网络的三次握手就是这个原理,整个三次握手的过程就是服务器和客户端互相确认对方和自己是否有接收数据的能力。
两次握手
如果不是三次握手而是两次握手会有啥结果呢?
还是拿丢沙包举例,试想如果不是三次丢沙包确定双方能力,而是两次丢沙包确定双方能力,结果会怎么样呢?
假如小客第一次扔沙包,抄得太高了,扔出一亿米,小服一时半会都接不到沙包

小客迟迟得不到小服的回应,于是又扔了一个新沙包

这个新沙包被小服顺利接到,于是,两个又嗨皮的继续第二次确认。确认完毕后两个人开始玩游戏,玩完这个游戏后,小客回家吃饭了。这时小客扔的第一个沙包终于落下来了,到了小服手里,小服接到了沙包,以为又有小朋友要跟他玩丢沙包的游戏

于是,小客把沙包扔到了墙的另一边,由于他们执行的是扔两次确定可以玩游戏的规则,小客扔完沙包,就认为对方有接收沙包的能力,于是便等着两人玩游戏,可是墙的另一边已经没有人了,小服会无限的等下去,造成了小服的时间和资源的浪费。
这就是两次握手所带来的问题,服务器不知道对方已经没有“扔沙包”的能力了,会一直等待下去。
四次握手
如果是四次握手呢?无疑是做了无用功,因为三次握手,已经让双方都确认了接收数据的能力,再多次握手,也不过是确定了已经确定的事情。

所以网络连接用的是三次握手,不是两次,也不是四次
四次分手

这里我们还是用上面的例子来解释。他们分手的步骤如下:
小客要回家了,但是得告诉小服,于是在纸上写着自己要回家了,把纸团扔给小服。小服接到后就明白小客是要回家了,自己知道了,但是小客还在等着小服告诉自己,说他知道了。
小服把小客的纸团丢过来,现在小客知道小服知道了,但是不知道小服要不要回家,而且自己的沙包还在小服那里,于是小客就等着。
小服在自己的纸上写着那我也回家了,顺便把沙包也丢了过来。小客接到后,知道小服也要回家了,自己的东西也收到了,但是还得告诉小服自己收到了,不然小服不知道小客是否收到,又站在另一边等着。
小客在纸上写着,我收到了,然后回家了,小服接到后,看到小客收到了,自己也回家了。

至此,传输层的主要任务已经完成,TCP 协议和 HTTP 协议一样,都是一种对客户端和服务端数据格式的规范。传输层将数据封装好后,将数据传输至网络层,让网络层进行处理。
网络层、数据链路层、物理层
网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。
网络层主要是为传输层提供服务,为了向传输层提供服务,则网络层必须要使用数据链路层提供的服务。而数据链路层的主要作用是负责解决两个直接相邻节点之间的通信,但并不负责解决数据经过通信子网中多个转接节点时的通信问题。
我们先来补充一下网络层的相关知识:
1 | 用来编辑电脑网卡的接口配置 |
我们知道一个通过一个 IP 地址就可以访问到指定的主机,那么网关和子网掩码是干什么的呢?
网关:用来将两个网络地址串联。
子网掩码:用来将网络地址和主机地址进行划分。
用 IP 地址 192.168.88.88 和子网掩码 255.255.255.0 做与运算,可以将 IP 地址理解为在 192.168.88.0 网络地址区段中的 88 号主机。
来看看网络层具体是怎么工作的:
现在你的主机的 IP 地址是 192.168.88.88 现在你要访问的 www.bibilailai.com 的 IP 地址是 192.168.99.99,假设此时的网络环境是刚刚搭建,所有的交换机还未发生 MAC 地址缓存。我们来看在网络层,是怎么查找路径的。

现在你要在网络中找到主机 192.168.99.99,你的主机需要携带着自己的 IP 地址和目标 IP 地址去互联网里找目标 IP 地址是 192.168.99.99 的服务器主机。先从本机路由表中查找,让目标 IP 地址和子网掩码进行按位与运算,看结果和第一项目标地址是否相同,相同则将去找对应的网关地址。
现在你要找服务器主机,目标 IP 地址为 192.168.99.99。
和第一个路由条目的子网掩码进行按位与运算,192.168.99.99&255.255.255.0=192.168.99.0,和目的地址 192.168.88.0 不匹配,和下一个路由条目进行匹配验证。
和第二个路由条目的子网掩码进行按位与运算,192.168.99.99&0.0.0.0=0.0.0.0,和目的地址匹配,将去找对应的 IP 地址。
主机知道了下一跳的 IP 地址,要进行数据传输,则要获取到下一跳的 MAC 地址,但此时你的主机和交换机并没有任何 MAC 地址的缓存,你的主机会发出一条数据包给交换机,就是图中的 ARP 请求包,其中 目标 MAC 地址为 FF:FF:FF:FF:FF:FF,这个地址为广播地址。协议栈的规定,所有网卡在 MAC 层都不过滤目的地址为 FF:FF:FF:FF:FF:FF 的数据包,这时这个局域网内除你的主机(源设备)外的所有的网络设备都会收到这条数据包,然后每个网络设备用自己的 IP 地址和目标 IP 地址进行比对,IP 一致的网络设备会将自己的 MAC 地址返回给源 MAC 地址的主机,返回的信息包也称为 ARP 响应包。并且交换机在局域网中转发 ARP 请求包的同时会记录源 MAC 地址并缓存到自己的 MAC 表中
图中主机 192.168.88.33 接收到之后,和目标 IP 地址进行比对,发现不一致,会丢弃这份广播数据。路由器收到后,经过比对 IP,发现一致,会接受到这份广播信息。
ARP 协议:将已知的 IP 地址转换为 MAC 物理地址。
并且此时交换机不再广播发送,因为现在的交换机都有自主学习的能力,它会记录上次广播的信息。
它会保存端口,MAC 地址的映射信息,所以这次路由器向局域网内的主机发送数据包时,交换机经过查看自己的 MAC 地址表会直接通过对应的端口发送给你的主机,而不会再次进行广播。

- 你的主机接收到响应包后,会将目标 IP 地址和源 IP 地址封装为 IP 数据包。

你的主机知道到了下一跳的路由器的 MAC 地址,则会将 IP 数据包发送至路由器,路由器则将自己的 IP 地址和 IP 数据包中的目标 IP 地址进行比对,IP 不一致,于是接着它要去找自己的下一跳。
路由器通过查询自己的路由表,拿目标地址和路由表中的每一行的子网掩码做 & 运算,发现接口 2 的目的网络匹配成功,于是通过网口 2 准备发送 IP 数据包,但是交换机的 MAC 地址表为空,于是同样发出 ARP 请求进行广播,通过和目标 IP 地址进行比对,主机 192.168.99.77 丢弃请求包,目标主机 192.168.99.99 进行捕获。
目标主机响应广播后,同样通过交换机的 MAC 地址表,将自己的 MAC 地址和 IP 地址以及路由器的 MAC 地址和 IP 地址封装一个 ARP 响应包进行返回。
路由器获取到自己的下一跳的 MAC 地址,将获取到的 IP 数据包再发送给目标主机服务器,目标主机服务通过将自己的 IP 地址和目标 IP 进行比对,IP 一致,至此路由结束。
至此,数据在互联网中的传输就讲完了,数据大致就是这样在互联网中流转的。
- 感谢您的赞赏。