第1讲 | 为什么要学习网络协议?

上帝为了阻止人类联合起来造通天塔,就让人类讲不同的语言,人类无法沟通,达不成“协议”,人类的通天塔计划就失败了。

千年之后,程序员通过使用通用的语言,将所有的计算机连接起来,形成当今的互联网。

#include <stdio.h>

int main()
{
    printf("Hello World!");
}

上面这段代码是计算机使用C语言向世界说你好的方式。其实这段文字也是一种协议,是人和计算机沟通的协议。只有通过这种协议,计算机才知道我们想让他做什么。

协议三要素

  • 语法:一段内容要符合一定的规则和格式,例如,括号要成对,结束要使用分号等;
  • 语义:一段内容要代表某种意义。例如,数字减去数字是有意义的,数字减文本是没有意义的;
  • 顺序:先干啥,后干啥。例如,先加上某个数值,再减去某个数值。

会了计算机语言,就能教给计算机完成你的工作了。

但是只教会一台机器做什么是不够的,你需要教给多台机器做什么,这就需要网络协议。只有通过网络协议,计算机之间才能相互协作,共同完成一件事。

我们来看看网络协议长什么样?

当你想要上网买一个东西,你打开浏览器,输入网址,然后浏览器给你展示一个花花绿绿的页面。

你有没有想过浏览器是怎么做到的,它之所以能展示页面是因为它收到了一段来自HTTP协议的东西。

格式像下面这样:

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Thu, 02 Apr 2020 12:01:33 GMT

<!DOCTYPE html>
<!--STATUS OK-->
<html>
  <head>
    <meta http-equiv=content-type content=text/html;charset=utf-8>
    <title>百度一下,你就知道</title></head>

我们看下,它是否符合协议的三要素?

首先,符合语法,只有按照这个格式浏览器才认。例如,上来是状态,然后是首部,然后是内容。

第二,符合语义,就是按照约定的意思来。例如,状态200,标识网页返回成功,404表示不成功。

第三,符合顺序,你点击浏览器,发出一个HTTP请求,然后才有上面的应答。

浏览器显然按照协议商定好了的,最后一个花花绿绿的页面就展示在你面前了。

我们常用的网络协议有哪些?

我们通过一个购物下单的过程,看看互联网世界的运行过程,都使用了哪些协议。

首先,你在浏览器里面输入了http://www.taobao.com,这是一个URL。浏览器只知道名字是www.taobao.com,但不知道具体的地址,所以不知道如何访问。于是,它打开地址簿去查找,可以使用一般的地址簿协议DNS查找,还可以使用更精准的HTTPDNS地址簿协议。

无论用哪一种方式查找,最后会得到类似这样一个地址:59.108.138.245。这是个IP地址,是互联网世界的门牌号。

知道了目标地址,浏览器就开始打包它的请求。对于普通的浏览请求,使用HTTP协议;对于购物的请求,需要加密传输,会使用HTTPS协议。无论什么协议,里面要写明“你要买什么和买多少”。

DNS、HTTP、HTTPS所在层称为应用层。经过应用层封装后浏览器会将应用层的教给下一层去完成,通过socket编程实现。

下一层是传输层。传输层有两种协议,一种是无连接的UDP,一种是面向连接的TCP。对于支付来讲,往往使用TCP协议。

面向连接就是TCP会保证这个包到达目的地,如果不能到达就重新发,直到到达。

TCP协议有两个端口,一个是浏览器监听的端口,一个是电商服务器监听的端口。操作系统通过端口判断,包应该给哪个进程。

传输层封装完毕后,浏览器将包交给操作系统的网络层。网络层的协议是IP协议。

IP协议里面有源IP地址,即浏览器所在机器的IP地址和目标IP地址,电商网站所在的IP地址。

操作系统知道了目标IP地址,就开始想根据这个门牌号找到目标机器。操作系统会判断这个目标IP是本地人,还是外地人。

如果是本地人通过门牌号就能看出来,显然电商网站不在本地。

操作系统知道这个包要发往远方,虽然不知道这个IP具体在哪,但是它知道发往外地的包都要发给网关,就好像我们去外国要经过海关。操作系统启动的时候会被配置一个默认的网关地址192.168.1.1。

操作系统如何将包发给网关呢?本地通信基本靠吼,操作系统大喊一声,谁是192.168.1.1?网关听到会回答,我就是,我在村东头。这个本地地址就是MAC地址,大吼一声的是ARP协议。

于是操作系统将IP包交给了下一层,MAC层。网卡将包发出去。这个包里有MAC地址,所以能够到达网关。

网关收到包之后,会根据自己的知识,判断下一步怎么走。网关往往是一个路由器,到某个IP怎么走,这个叫路由表。

路由器像唐僧取经路过的一个个国家的城关,每个城关连个两个国家,每个国家就是一个局域网,每个国家内部,可以使用MAC地址通信。

一旦跨越网关,就需要拿出IP头来,上面写着源IP地址(我从哪里来?),目标IP地址(我要到哪里去?)。然后问接下来该怎么走?

城关是知道这些知识的,城关和临近的城关会经常沟通。到哪里该怎么走,这种沟通的协议称为路由协议,常用的有OSPF和BGP。

城关和城关之间是一个国家,当网络包知道了下一步去哪个城关,还是要使用该国家内部的MAC地址,找到下一个城关,然后问下一步怎么走,一直走到最后一个城关。

最后一个网关知道这个网络包要去的地方就在这个国家。于是大吼一声,谁是目标IP?目标服务器就会回一个MAC地址。通过这个MAC地址就能找到目标服务器。

目标服务器发现目标MAC地址对上了。取下MAC头,发给操作系统的网络层。发现IP也对上了,就取下IP头。IP头里会写上一次封装的是TCP协议,然后交给TCP层。

在这一层,对于每个收到的包,都会回复一个包说明收到了。这个回复包仅仅是TCP层的一个说明,并不是这次下单请求的结果。这个包沿着来的方向走回去,报个平安。

因为一旦出门,路上千难万险,万一遇上白骨精可咋弄?因而到了要报个平安。

如果过一段时间还是没有到,发送到的TCP层会重发送这个包,重复上面的过程,直到收到应答包。这个重试也仅仅是TCP层的,不是浏览器重新提交了一次下单请求。浏览器只发送了一次下单请求,TCP层不断自己闷头重试。

当网络包平安到达TCP层之后,TCP头中有目标端口,通过这个端口,可以找到电商网站的进程正在监听这个端口,假设是一个tomcat,将这个包发给电商网站。

电商网站进程得到HTTP请求内容,直到买什么东西,买多少。电商网站接待请求的Tomcat只是个接待员,负责统筹处理这个请求,而不是所有事情自己做。

如何告诉相关进程呢?通过RPC调用,即远程过程调用。

当接待员发现相应的部门都处理完毕,就回复一个HTTPS的包,告知下单成功。这个HTTPS的包,会像来的时候一样,经过千难万险到达你的个人电脑,最终进入浏览器,显示支付成功。

小结

看看,一个简单的下单过程,中间出来这么的协议。而管理一大片机器更是需要借助各种协议来完成。

这里列出来以后要讲的网络协议。

上面的下单的故事只是给了一个大致的框架。

问题:

当网络包到达一个城关的时候,可以通过路由表得到下一个城关的IP,直接通过IP地址发送包就可以了,为什么还要通过本地的MAC地址呢?

答案:

IP是网络层使用的,MAC是链路层使用的,IP包最终还是要通过物理链路和MAC地址进行交互。

发布了23 篇原创文章 · 获赞 0 · 访问量 974

猜你喜欢

转载自blog.csdn.net/u014635079/article/details/105277578
今日推荐