来自极客时间《趣谈网络协议》

学习过程遇见问题:一看觉得懂,一问就打鼓,一用就糊涂。

1.为什么要学习网络协议

一般编译过程:

词法分析:

词法分析是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列,这个词法单元序列被输出到语法分析器进行语法分析。

另外,由于词法分析器在编译器中负责读取源程序,因此除了识别词素之外,它还会完成一些其他任务,比如过滤掉源程序中的注释和空白,将编译器生成的错误消息与源程序的位置关联起来等。

总而言之,词法分析器的作用如下:

  1. 读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列;
  2. 过滤掉源程序中的注释和空白;
  3. 将编译器生成的错误消息与源程序的位置关联起来;
  4. 其它。

语法分析:

词法分析器把源程序转换成了一个词素序列,它让我们知道了一个符号序列’i’、’f’是一个关键词”if”,而一个符号序列’1’、’2’、’3’、’4’是一个常量”1234”等等。但是,词法分析器的工作也到此为止了,它不能说明几个词素之间的关系。例如,对于词素串”int”、”x”、”=”、”1”、”;”,词法分析器不知道它是一个语句;对于词素串”int”、”x”、”==”、”1”、”;”,词法分析器不能检测出它的语法错误。为此,在词法分析之后,还需进行语法分析。

我们都知道,在使用某一种程序设计编写程序时,都要遵循一套特定的规则。比如,在C语言中,一个程序由多个函数组成,一个函数由声明和语句组成,一个语句由表达式组成等等。这组规则精确描述了一个良构的程序设计语言的语法。语法分析器能够确定一个源程序的语法结构,能够检测出源程序中的语法错误,并且能够从常见的错误中恢复并继续处理程序的其余部分。

一个语法分析器从词法分析器获得一个词素序列,并验证这个序列是否可以由源语言的文法生成。语法分析器会构造一棵语法分析树,并把它传递给编译器的其他部分进一步处理,在构建语法分析树的过程中,就验证了这个词素序列是否符合源语言的文法。语法分析器在编译器中的位置如下图:


文法

语法分析程序判断源程序在结构上是否正确,源程序的结构由上下文无关文法描述。

一个文法用于系统的描述程序设计语言的构造的语法。一个正确设计的文法给出了一个语言的结构,该结构有助于把源程序翻译为正确的目标代码,也有助于检测错误。

一个上下文无关文法(下文简称文法)由终结符号、非终结符号、一个开始符号和一组产生式组成:

推导和规约

我们介绍了如何用上下文无关文法描述一种语言的语法,和如何使用推导和规约构造一棵语法分析树,以及如何对文法进行转换使之能够更适用于语法分析。

语法分析器在构建一棵语法分析树时,常用的方法可以分为自顶向下和自底向上的。顾名思义,自顶向下的方法是从语法分析树的根结点开始向叶子结点构造的方法,自底向上的方法是从语法分析树的叶子结点开始向根结点构造的方法。在自顶向下的构造过程中,需要从一个非叶子结点“推导”出其子树;在自底向上的构造中,需要把几个非根结点“规约”成其根结点。

设计文法

本节将介绍如何对一个文法进行转换使其更适用于语法分析,这些转换方法包括消除二义性,消除左递归和提取左公因子。

除此之外还有自顶向下的语法分析和LL(1)方法、自底向上的语法分析和SLR方法、比SLR更为强大的LR方法。

上面介绍更多请参考:https://blog.csdn.net/jzyhywxz/article/category/7235835

语义分析:

语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实数用作数组下标的情况报告错误。又比如某些程序规定运算对象可被强制,那么当二目运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错误。

语义分析的地位:编译程序最实质性的工作;第一次对源程序的语义作出解释,引起源程序质的变化。

协议三要素:

1.语法:就是这一段内容要符合一定的规则和格式。例如,括号要成对,结束要使用分号等。
2.语义:就是这一段内容要代表某种意义。例如数字减去数字是有意义的,数字减去文本一般来说就没有意义。
3.顺序(时序):就是先干啥,后干啥。例如,可以先加上某个数值,然后再减去某个数值。

网络协议示例:

HTTP/1.1 200 OK
Date: Tue, 27 Mar 2018 16:50:26 GMT
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
<!DOCTYPE html>
<html>
<head>
<base href="https://pages.kaola.com/" />
<meta charset="utf-8"/> <title> 网易考拉 3 周年主会场 </title>

这符合协议的三要素吗?我带你来看一下。
首先,符合语法,也就是说,只有按照上面那个格式来,浏览器才认。例如,上来是状态,然后是首部,然后是内容。
第二,符合语义,就是要按照约定的意思来。例如,状态 200,表述的意思是网页成功返回。如果不成功,就是我们常见的“404”。
第三,符合顺序,你一点浏览器,就是发送出一个 HTTP 请求,然后才有上面那一串 HTTP 返回的东西。

各层主要协议:

应用层:DNS、HTTP、HTTPS、FTP、SMTP(Simple Mail Transfer Protocol, SMTP)、DHCP、RTMP、P2P、GTP、RPC
传输层:TCP、UDP
网络层:IP、ACMP、ICMP、OSPF、BGP、IPSec、GRE
数据链路层:Ethernet、PPP(点对点协议(Point to Point Protocol))、ARP(Address Resolution Protocol)、VLAN、STP
物理层:网络跳线、IEEE802.1A、IEEE802.2、IEEE802.11等等

附注:常用路由协议OSPF(Open Shortest Path First开放式最短路径优先)、BGP(边界网关协议)

协议介绍更多可以参考:https://blog.csdn.net/qq_22238021/article/details/80279001

课后问题:

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

1.局域网内IP地址是动态分配的,假如我是192.168.2.100,如果我下线了,可能IP就分配给了另一台电脑。IP和设备并不总是对应的,这对通信就产生了问题,但是MAC地址不同,MAC地址和设备是一一对应且全球唯一的。所以局域网使用MAC地址通信没有问题。
2.历史遗留问题:早期的以太网只有交换机,没有路由器,以太网内通过MAC地址通信。后来才有了互联网,为了兼容原本的模式,采用了IP+MAC地址通信的方式。为啥不推到了重来呢?看看IPv6的处境你就知道了。所以是先有MAC地址后有的IP,IP的提出主要还是因为MAC地址本身的缺陷,这个问题换成有了MAC为何还要IP地址也很有意思。
3.我这里简单说一下第一:MAC地址本身的缺陷:因为MAC地址是硬件提供商写在网卡中的,MAC地址虽然唯一但是不能表明用户在整个互联网中的位置,除非维护一个超级大MAC地址对应表,那寻址效率肯定爆炸。但是IP地址解决了这个问题,因为IP地址是网络提供商给你的,所以你在哪里整个网络都是知道的。第二:安全问题:获取MAC地址是通过ARP协议来完成的,如果只用MAC地址通信,那么广播风暴是个难题。
4.那么我觉得如果哪天每人一个固定的IPv6地址,那么我觉得MAC地址+IPv4的模式是不是可以被替换了?

经典问题:

从输入URL到页面展示的过程介绍:

https://blog.csdn.net/u014465934/article/details/82967641
https://blog.csdn.net/w372426096/article/details/82012229

其他HTTP相关问题:

参考:
https://blog.csdn.net/w372426096/article/details/82669631
https://blog.csdn.net/w372426096/article/details/81836919

2.以一个实例来讲述网络传输过程

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

无论用哪一种方法查找,最终都会得到这个地址:106.114.138.24。这个是IP地址,是互联网世界的“门牌号”。

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

DNS、HTTP、HTTPS 所在的层我们称为应用层。经过应用层封装后,浏览器会将应用层的包交给下一层去完成,通过 socket 编程来实现。下一层是传输层。传输层有两种协议,一种是无连接的协议UDP,一种是面向连接的协议TCP。对于支付来讲,往往使用 TCP 协议。所谓的面向连接就是,TCP 会保证这个包能够到达目的地。如果不能到达,就会重新发送,直至到达。

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


传输层封装完毕后,浏览器会将包交给操作系统的网络层。网络层的协议是 IP 协议。在 IP 协议里面会有源 IP 地址,即浏览器所在机器的 IP 地址和目标 IP 地址,也即电商网站所在服务器的 IP 地址。


操作系统既然知道了目标 IP 地址,就开始想如何根据这个门牌号找到目标机器。操作系统往往会判断,这个目标 IP 地址是本地人,还是外地人。如果是本地人,从门牌号就能看出来,但是显然电商网站不在本地,而在遥远的地方。

操作系统知道要离开本地去远方。虽然不知道远方在何处,但是可以这样类比一下:如果去国外要去海关,去外地就要去网关。而操作系统启动的时候,就会被 DHCP 协议配置 IP 地址,以及默认的网关的IP 地址 192.168.1.1。

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


于是操作系统将 IP 包交给了下一层,也就是MAC 层。网卡再将包发出去。由于这个包里面是有 MAC地址的,因而它能够到达网关。

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

路由器有点像玄奘西行路过的一个个国家的一个个城关。每个城关都连着两个国家,每个国家相当于一个局域网,在每个国家内部,都可以使用本地的地址 MAC 进行通信。

一旦跨越城关,就需要拿出 IP 头来,里面写着贫僧来自东土大唐(就是源 IP 地址),欲往西天拜佛求经(指的是目标 IP 地址)。路过宝地,借宿一晚,明日启行,请问接下来该怎么走啊?

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

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

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

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

在这一层里,对于收到的每个包,都会有一个回复的包说明收到了。这个回复的包绝非这次下单请求的结果,例如购物是否成功,扣了多少钱等,而仅仅是 TCP 层的一个说明,即收到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安。

因为一旦出了国门,西行路上千难万险,如果在这个过程中,网络包走丢了,例如进了大沙漠,或者被强盗抢劫杀害怎么办呢?因而到了要报个平安。

如果过一段时间还是没到,发送端的 TCP 层会重新发送这个包,还是上面的过程,直到有一天收到平安到达的回复。这个重试绝非你的浏览器重新将下单这个动作重新请求一次。对于浏览器来讲,就发送了一次下单请求,TCP 层不断自己闷头重试。除非 TCP 这一层出了问题,例如连接断了,才轮到浏览器的应用层重新发送下单请求。

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

电商网站的进程得到 HTTP 请求的内容,知道了要买东西,买多少。往往一个电商网站最初接待请求的这个 Tomcat 只是个接待员,负责统筹处理这个请求,而不是所有的事情都自己做。例如,这个接待员要告诉专门管理订单的进程,登记要买某个商品,买多少,要告诉管理库存的进程,库存要减少多少,要告诉支付的进程,应该付多少钱,等等。

如果告诉相关的进程呢?往往通过 RPC 调用,即远程过程调用的方式来实现。远程过程调用就是当告诉管理订单进程的时候,接待员不用关心中间的网络互连问题,会由 RPC 框架统一处理。RPC 框架有很多种,有基于 HTTP 协议放在 HTTP 的报文里面的,有直接封装在 TCP 报文里面的。

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

趣谈网络协议1-为什么学习网络协议相关推荐

  1. Python30 网络编程通讯协议,1.学习网络编程的目的 2.什么是互联网 3.c/s结构 4.通讯基本要素 5.OSI模型...

    今日内容: 网络通讯协议 1.学习网络编程的目的 2.什么是互联网 3.c/s结构 4.通讯基本要素 5.OSI模型 思维路线 目的是要链接互联网中的其他计算机 物理层 用物理介质链接其他计算机 数据 ...

  2. 网络篇 谈谈对学习网络的看法

    文章目录 前言 一.网络是什么? 二.谈谈对学习网络的看法 总结 前言 如今,我们的生活已经离不开网络,与我们生活息息相关的技术实在太多,比如移动支付.数字电视.电子游戏.数据库.远程教育等方面.网络 ...

  3. GB28181协议简介以及学习GB28181协议所涉及的名词汇总(入门篇)

    1.GB/T 28181 -2016协议简介: 近年来,国内视频监控应用发展迅猛,系统接入规模不断扩大,涌现了大量平台提供商,平台提供商的接入协议各不相同,终端制造商需要给每款终端维护提供各种不同平台 ...

  4. 网络技术工程师专业核心 | 网络技术工程师就业方向

    一.网络技术工程师专业定义 本专业主要面向对网络感兴趣的有志青年,通过本专业的学习,可以处理常见的电脑软.硬件故障,能够组建并维护大中型企业的网络环境及相应的广域网系统,能够熟练操作思科.华为等主流厂 ...

  5. [趣谈网络协议学习] 03 DHCP与PXE:IP是怎么来的, 又是怎么没的?

    如何配置 IP 地址? 在linux中可以使用ifconfig, 也可以使用ip addr. 设置好了以后, 用这两个命令, 将网卡 up 一·下, 就可以开始工作了. 使用 net-tools: s ...

  6. [趣谈网络协议学习] 08 世界这么大,我想出网关:欧洲十国游与玄奘西行

    MAC头与IP头 MAC头 目标 MAC 地址 源 MAC 地址 协议类型:说明里面是 IP 协议 IP头 详情可参见 IP数据报格式详解 版本号:占用4位二进制数,表示该IP数据报使用的IP协议版本 ...

  7. 《趣谈网络协议》学习笔记 DAY03

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 软件定义网络SDN OpenFlow和OpenvSwitch实现SDN OpenFlow协议 OpenvSwitc ...

  8. 《趣谈网络协议》学习笔记 DAY08

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 RPC协议综述 远程调用需要解决的5个问题 协议约定问题 RPC调用标准 传输问题 ONC RPC的类库 服务发现 ...

  9. 《趣谈网络协议》学习笔记DAY15

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 零星知识点 如何打通公有云和私有云 QUIC的特性 http中的keepalive 参考 零星知识点 如何打通公有 ...

最新文章

  1. 01.05第六周周总结
  2. 迷你linux设备,ComputeLab发布MintBox迷你PC:专为Linux系统玩家打造
  3. 欢乐纪中A组周六赛【2019.3.30】
  4. 微课|中学生可以这样学Python(3.3节):多分支选择结构
  5. 使用php-amqplib连接rabbitMQ 学习笔记及总结
  6. 软件工程 第六章 编码与测试
  7. android 百度 tts,百度语音TTS. android 启动时闪退
  8. 网络安全-SQL注入原理、攻击及防御
  9. IE浏览器自带打印控件WebBrowser
  10. 高德地图怎么测量面积_高德地图如何测量海拔
  11. oracle nlv 全称,oracle: OCA-047-题解与实验(9)--SQL语句中COUNT和NLV的用法
  12. ArcGIS学习记录—dbf shp shx sbn sbx mdb adf等类型的文件的解释
  13. Centos 7.7下Oracle 11g RAC
  14. 洛谷1268树的重量(树)
  15. 玩转华为数据中心交换机系列 | 配置VLAN内协议报文透传示例
  16. Linux 调用openoffice报错 disconnected unexpectedly
  17. mysql 三阶多项式拟合,《统计学习导论-基于R应用》第三章:线性回归(代码)...
  18. 下载的图片损坏 图片完整性检测工具
  19. GeoServer搭建私有地图服务,Cesium引擎加载。
  20. C++中模板类中的成员函数以及模板函数在类外定义

热门文章

  1. 虚拟直播与光学动作捕捉技术
  2. Java码农进阶之路~环境及特点
  3. Github testerSunshine/12306 Linux系统部署
  4. 云中数据_免费备份和共享云中数据的最佳网站
  5. 数据产品经理=数据+产品经理?
  6. Effective C++:改善程序与设计的55个具体做法
  7. 情人节表白代码(1)
  8. 计算机毕业设计ssm基于SSM的资产管理平台的设计与实现hx448系统+程序+源码+lw+远程部署
  9. 十进制与二进制相互转换(包括带小数点.各类进制转换公式)
  10. 循环获取控制台输入scanner.nextLine()问题