一次网页请求的整个过程

当我们在浏览器的地址栏输入了URL,按下Enter之后发生了什么呢?

DNS解析

什么是DNS解析?公司的网络经常可以发微信钉钉,但是就是访问不了网页,这是为什么?

客户端发起TCP连接请求

客户端发起HTTP请求

服务端负载均衡

服务端响应HTTP请求

服务端关闭TCP连接

浏览器渲染

网络协议

什么是协议?

协议三要素

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

网络体系结构

经常听说OSI七层网络模型、TCP/IP四层模型、五层模型,他们之间有什么区别呢?

img

以上分别对应TCP/IP四层模型、五层模型、OSI七层模型

img

img

img

OSI七层模型

OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。

​ ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有公司使用这个规范来控制网络。这样所有公司都有相同的规范,就能互联了。(OSI由于体系比较复杂,而且设计先于实现,有许多设计过于思想,不太方便计算机软件实现,因而完全实现OSI参考模型的系统不多,应用的范围有限。)

img

TCP/IP四层模型

OSI是一个完整的、完善的宏观理论模型。而TCP/IP(参考)模型,更加侧重的是互联网通信核心(也是就是围绕TCP/IP协议展开的一系列通信协议)的分层,因此它不包括物理层,以及其他一些不想干的协议;其次,之所以说他是参考模型,是因为他本身也是OSI模型中的一部分,因此参考OSI模型对其分层。

TCP/IP五层模型

五层体系结构包括:应用层、运输层、网络层、数据链路层和物理层。五层协议只是OSI和TCP/IP的综合,实际应用还是TCP/IP的四层结构。

所谓的五层协议的网络体系结构其实是为了方便学习计算机网络原理而采用的,综合了OSI七层模型和TCP/IP的四层模型而得到的五层模型。

img

应用层(乘客)

应用层协议的内容,就是我们程序直接面对的,要使用的数据,也是整个网络传输要传递的内容。

如何去理解这些内容和数据呢?协议其实就是一种规范,有各种各样的数据结构需要通信双方遵守,然后双方都有相同的计算机程序来进行编码和解码。我们把这些应用层协议的内容比作整个体系结构的乘客,他们心中只有目的地,买了票上了车,中间的路怎么走,用什么交通工具走就交给底层的协议了。应用层协议,只需要达到目的地的时候,能够把自己介绍清楚即可。

有这么些乘客是常见的:

  • DNS 协议,Domain Name System,这个应该很熟悉吧?
  • HTTP 协议,我们平时接触得最多。而且协议的版本也在不断的升级,从原始的 http 1.0,到 http 1.1,再到未来的基于 spdy 完成的 http 2.0。这些版本的升级,最大的改变还是传输的效率的提升。在格式各样的计算机网络中,有一个圣地那就是万维网 WWW。在这个网络中行走的乘客就是 HTTP 协议,带着文本,图像、视频等数据,往来于不同的站点。所以也可以把它们看成携带着大量货物的商队,来往于各个城市站点。
  • DHCP协议:DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。
  • RPC协议:RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
  • FTP、SMTP、POP3等等

传输层(指挥调度)

运输层是体系结构的调度者,管理着数据的传输的一些策略。

什么时候可以传?要传多少?要不要接收?什么时候结束?

运输层有两个调度者,两种不同的风格,分别为 TCPUDP

TCP 很严格,一个包都不能有失,完美主义的处女座,因为纪律严明且要求严格的 TCP 工作效率并不高,每次发完一阵子都要确认一下是否顺序正确,不正确的话再发个包。UDP 就比较不拘小节,丢包了乱序了都不管,所以在网络环境好的情况下,UDP 可以做到快速而且正确率高。他们俩就像美女与野兽中的胖瘦管家。双方都有自己的优缺点,至于什么情况下发光发热,扬长避短,得看具体的业务场景。比如 DNS 乘客选择不拘小节的 UDP 作为调度者,中途数据出差错就再解析一次。而 HTTP 乘客,因为可靠性要求高,数据不容有失,选择了 TCP。

TCP 调度者的工作内容主要三大块,分别为可靠传输、流量控制和拥塞避免。简单理解,可靠传输就是希望传输过程中有丢包或者错误包的现象,让发送端重传;流量控制就是建了个缓冲池,让接收方和发送方用合适的速率传输,不会因为传输太快导致数据丢失。比如我们有一个仓库大小就那么大,东西都还没用完,又不停地往里面存东西,那么直接结果是仓库爆了后后面送过来的货物还要重新送,还不如直接告诉发送端,仓库满了,等等吧。这就是后面会提到的 TCP 首部的窗口大小;拥塞避免就是在网络环境差的情况下,有好的机制减低发包节奏,缓解网络环境。比如在某个城市开车,出行的人突然增加,那么等个时间再出来。

UDP 调度者因为不需要严格的建立连接,又不需要各种确认机制保证包不乱,所以整个协议非常轻量。如果想要保证数据的完整且接收的顺序无误,那么得应用层协议自己来。

网络层(向导)

网络层的是体系结构的向导,负责找到要到达接收方的路径。

经过了传输层,包大小确定了,传输时间也决定了。然后,手里只有 IP 和 端口号,就像现在厦门,并且知道了目标地点是北京,可是该怎么走呢?需不需要中转?中转的地方又在哪里?

这时候要看 IP 协议族了。这个大家族都吃这碗饭,提供指路服务。

运输层的包,比如 TCP 或者 UDP,向导会填入目的信息。所以,在这个过程中它做的就是找到下一站,然后到达之后再寻找下一站直到终点。

网络层向导有会去问路,如何能够找到最短路径,或者能最快到达的路径呢?比如从中国到美国,是从太平洋走,还是先去欧洲再走大西洋呢?那条路能够更快到达目的地。于是问路就有了两种不同的策略,有用 RIP 协议去问路,又或者是 OSPF 协议去问路(路由协议)。

数据链路层(交通工具)

数据链路层里的协议就是要使用的交通工具了。

不同网络的差异性主要就体现在这一层。对于数据,并不需要我们路上经过了什么,怎么走。但交通工具要明白。不同的网络,交通情况是不一样,所以有不同的策略来走。

比如去往 ISP 使用 PPP 协议。

在普通局域网内部使用 CSMA/CD 协议。

数据链路层的协议,无论选择什么样的行走策略,无论是在天上飞的,地上跑的,海里游的,都会面临三个基本问题:封装成帧、透明传输和差错检测。解决了这三个问题,那么这个交通工具就可以上路了。

物理层(道路)

什么时候出发,去什么地方,用什么方式走都已经确定好了,转化为二进制信号后,由物理层真实地发送到目标地址去。那这条路物理层传输的带宽怎样,就像我们的道路是四车道还是六车道,是大道还是羊肠小路。传输的速率怎样,就像这条路的路况如何,是坑坑洼洼的还是一马平川。

物理层的特性决定的路况。不同地方的贫富差距不一样,或者环境的限制,修的路也不一样。有的用双绞线,有的用同轴电缆,再不错的就用光纤了。所以,在相同的时间里,在不同的物理层设备环境中,可能你还在厦门岛内堵车,我已经搭动车飞驰 200 公里到另一座城市。

TCP/IP协议

Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。协议采用了4层的层级结构。然而在很多情况下,它是利用 IP 进行通信时所必须用到的协议群的统称。

TCP和UDP

  • TCP 是面向连接的、可靠的流协议,通过三次握手建立连接,通讯完成时要拆除连接。
  • UDP是面向无连接的通讯协议,UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象。

TCP

TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。

TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

UDP

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。

UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。

UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询—应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。

使用UDP的服务包括1.NTP(网络时间协议)和DNS(DNS也使用TCP),包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)。

常用QQ,就是一个以UDP为主,TCP为辅的通讯协议。

端口号

数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。

一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。

端口号的确定

  • 标准既定的端口号:这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一个端口号。例如 HTTP、FTP、TELNET 等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在 01023 之间;除知名端口号之外,还有一些端口号被正式注册,它们分布在 102449151 之间,不过这些端口号可用于任何通信用途。
  • 时序分配法:服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。在这种方法下,客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配。动态分配的端口号范围在 49152~65535 之间。

img

img

数据包的传输

  • 包是全能性术语;
  • 帧用于表示数据链路层中包的单位;
  • 片是 IP中数据的单位;
  • 段则表示 TCP 数据流中的信息;
  • 消息是指应用协议中数据的单位。

每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。

网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。

img

  1. 应用程序处理:
  • 首先应用程序会进行编码处理,这些编码相当于 OSI 的表示层功能;
  • 编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于 OSI 的会话层功能。
  1. TCP模块的处理:
  • TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。
  • TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。
  1. IP模块的处理:
  • IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。
  • IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。
  1. 网络接口(以太网驱动)的处理:
  • 从 IP 传过来的 IP 包对于以太网来说就是数据。
  • 给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。
  1. 网络接口(以太网驱动)的处理:
  • 主机收到以太网包后,首先从以太网包首部找到 MAC地址判断是否为发送给自己的包,若不是则丢弃数据。
  • 如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。这里的例子则是 IP 。
  1. IP模块处理:
  • IP 模块接收到数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。
  • 另外,对于有路由器的情况,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送往的主机或路由器之后再进行转发数据。
  1. TCP 模块的处理:
  • 在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。
  • 数据被完整地接收以后,会传给由端口号识别的应用程序。
  1. 应用程序的处理:
  • 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。