网卡:负责以太网或无线网络通信的硬件;功能:将协议栈发送来的数据包转换为电信号,并通过网线发送出去——>网络;
网卡会将包转换为电信号并通过网线发送出去。这样一来,包就进入到网络之中了。
*路由器后面链接着互联网的入口——接入网;而接入网连接到签约的网络运营商——接入点设备;
接入网连接到签约的网络运营商,并接入被称为接入点(Point of
浏览器在访问某个页面的数据时,请求可能直接会被WEB服务器侧的缓存服务器响应;
检查完之后,网络包接下来可能还会遇到缓存服务器。网页数据中有一部分是可以重复利用的,这些可以重复利用的数据就被保存在缓存服务器中。如果要访问的网页数据正好在缓存服务器中能够找到,那么就可以不用劳烦Web服务器,直接从缓存服务器读出数据。此外,在大型网站中,可能还会配备将消息分布到多台Web服务器上的负载均衡器,还有可能会使用通过分布在整个互联网中的缓存服务器来分发内容的服务。经过这些机制之后,网络包才会到达Web服务器
了解浏览器是如何将消息委托给操作系统发送给Web服务器的,有什么意义?
浏览器客户端向服务器发送请求的内容?URI(对什么)+方法(进行怎样的操作)
客户端会向服务器发送请求消息(图1.4)。请求消息中包含的内容是“对什么”和“进行怎样的操作”两个部分。
*Web服务器响应消息的内容?
收到请求消息之后,Web服务器会对其中的内容进行解析,通过URI和方法来判断“对什么”“进行怎样的操作”,并根据这些要求来完成自己的工作,然后将结果存放在响应消息中。在响应消息的开头有一个状态码,它用来表示操作的执行结果是成功还是发生了错误。
*GET方法访问流程?
*POST使用场景?
还有一个经常使用的方法就是POST。我们在表单[插图]中填写数据并将其发送给Web服务器时就会使用这个方法。当我们在网上商城填写收货地址和姓名,或者是在网上填写问卷时,都会遇到带有输入框的网页,而这些可以输入信息的部分就是表单。
*1条请求消息中只能填写1个URI。如果需要获取多个文件,必须对每个文件单独发送1条请求;
判断所需的文件,然后获取这些文件并显示在屏幕上,这一系列工作的整体指挥也是浏览器的任务之一,而Web服务器却毫不知情。Web服务器完全不关心这4条请求获取的文件到底是1个网页上的还是不同网页上的,它的任务就是对每一条单独的请求返回1条响应而已。
向DNS查询IP地址操作——域名解析本地执行查询、解析的客户端——Socket库提供的接口向DNS服务器发出查询,也就是向DNS服务器发送查询消息,并接收服务器返回的响应消息。换句话说,对于DNS服务器,我们的计算机上一定有相应的DNS客户端,而相当于DNS客户端的部分称为DNS解析器,或者简称解析器。通过DNS查询IP地址的操作称为域名解析,因此负责执行解析(resolution)这一操作的就叫解析器(resolver)了。
调用Socket库对应的解析器时,解析器会生成发送给DNS服务器的查询消息;但是发送消息还是要委托给操作系统内部的协议栈来执行;
发送消息这个操作并不是由解析器自身来执行,而是要委托给操作系统内部的协议栈[插图]来执行。这是因为和浏览器一样,解析器本身也不具备使用网络收发数据的功能。
*关于协议栈:
解析器调用协议栈后,控制流程会再次转移,协议栈会执行发送消息的操作,然后通过网卡将消息发送给DNS服务器(图1.12④⑤)。
DNS解析器委托协议栈发送查询域名IP请求,走UDP?
接下来,消息经过网络到达客户端,再经过协议栈被传递给解析器(图1.12⑦⑧),然后解析器读取出消息取出IP地址
将管理下级域的DNS服务器IP地址注册到它的上级DNS服务器中:这样就可以通过上级DNS服务器查询到下级DNS服务器的IP地址;
我们可以采用下面的办法。首先,将负责管理下级域的DNS服务器的IP地址注册到它们的上级DNS服务器中,然后上级DNS服务器的IP地址再注册到更上一级的DNS服务器中,以此类推
真是互联网中加快DNS服务器响应方式1:一台DNS服务器管理多个上下级域;
在真实的互联网中,一台DNS服务器可以管理多个域的信息
因为DNS服务器有一个缓存[插图]功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始向下进行。相比每次都从根域找起来说,缓存可以减少查询所需的时间。
*如何应对域名信息被缓存后,原来域名的注册信息发生了改变?
那就是信息被缓存后,原本的注册信息可能会发生改变,这时缓存中的信息就有可能是不正确的。因此,DNS服务器中保存的信息都设置有一个有效期,当缓存中的信息超过有效期后,数据就会从缓存中删除。而且,在对查询进行响应时,DNS服务器也会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的DNS服务器。
套接字描述符:用来识别同一台计算机内部的套接字;端口号:用来帮助识别不同计算机上的套接字;如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制[插图]。
*IP地址和端口号:客户端和服务器之间用来识别对方套接字的机制;
,首先,客户端在创建套接字时,协议栈会为这个套接字随便分配一个端口号[插图]。接下来,当协议栈执行连接操作时,会将这个随便分配的端口号通知给服务器
*客户端是如何接受消息的?
调用read时需要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区。于是,当服务器返回响应消息时,read就会负责将接收到的响应消息存放到接收缓冲区中。由于接收缓冲区是一块位于应用程序内部的内存空间,因此当消息被存放到接收缓冲区中时,就相当于已经转交给了应用程序。
*浏览器向Web请求消息后,断开链接过程如下:
Web使用的HTTP协议规定,当Web服务器发送完响应消息之后,应该主动执行断开操作[插图],因此Web服务器会首先调用close来断开连接。断开操作传达到客户端之后,客户端的套接字也会进入断开阶段。接下来,当浏览器调用read执行接收数据操作时,read会告知浏览器收发数据操作已结束,连接已经断开。浏览器得知后,也会调用close进入断开阶段。
传输层:
套接字概念:协议栈内部有一块存放控制信息的内存空间,控制信息包括:通信对象的IP地址、端口号、通信操作的进行状态等;
在协议栈内部有一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信息,例如通信对象的IP地址、端口号、通信操作的进行状态等。
协议栈将应用层传来的数据存放在内部的发送缓冲区中?
MTU:以太网中每个网络包能容纳的最大数据长度:1500字节;MSS:MTU是包含了头部的总长度,因此减去头部的长度才是一个网络包能容纳的最大数据长度;
MTU是包含头部的总长度,因此需要从MTU减去头部的长度,然后得到的长度就是一个网络包中所能容纳的最大数据长度,这一长度叫作MSS[插图]
*应用程序的数据一般都比较大,因此TCP会按照网络包的大小对数据进行拆分:
应用程序的数据一般都比较大,因此TCP会按照网络包的大小对数据进行拆分。
*TCP头部中seq和ack的作用:seq:
我们先来看一下确认的原理(图2.7)。首先,TCP模块在拆分数据时,会先算好每一块数据相当于从头开始的第几个字节,接下来在发送这一块数据时,将算好的字节数写在TCP头部中,“序号”字段就是派在这个用场上的
客户端发起建立连接时,将SYN置1发送给服务器过程中,同时对seq设置了随机的初始值?——担心有人利用seq = 1代表建立连接发起攻击
大家应该还记得在我们刚才讲过的连接过程中,有一个将SYN控制位设为1并发送给服务器的操作,就是在这一步将序号的初始值告知对方的。实际上,在将SYN设为1的同时,还需要同时设置序号字段的值,而这里的值就代表序号的初始值[插图]。
TCP支持无限重传吗?——不支持,TCP在几次重传无效后强制结束进程,并向应用程序报错;
因此TCP会在尝试几次重传无效之后强制结束通信,并向应用程序报错。
TCP采用了动态调整等待时间的方法,这个等待时间是根据ACK号返回所需的时间来判断的。具体来说,TCP会在发送数据的过程中持续测量ACK号的返回时间,如果ACK号返回变慢,则相应延长等待时间;相对地,如果ACK号马上就能返回,则相应缩短等待时间[插图]。
*滑动窗口的基本思路:
前面提到的能够接收的最大数据量称为窗口大小[插图],它是TCP调优参数中非常有名的一个。
接送放更新窗口大小的时机?当接收方将数据传递给应用程序,导致接收缓冲区剩余容量增加时;
因此,更新窗口大小的时机应该是接收方从缓冲区中取出数据传递给应用程序的时候。这个操作是接收方应用程序发出请求时才会进行的,而发送方不知道什么时候会进行这样的操作,因此当接收方将数据传递给应用程序,导致接收缓冲区剩余容量增加时,就需要告知发送方,这就是更新窗口大小的时机。
收发数据结束的时间点——应用程序判断所有数据都已经发送完毕的时候;——此时数据发送完毕的一方会发起断开过程;收发数据结束的时间点应该是应用程序判断所有数据都已经发送完毕的时候。这时,数据发送完毕的一方会发起断开过程,但不同的应用程序会选择不同的断开时
服务端发送数据完毕,调用close关闭连接后,如果应用程序调用read来读取数据,此时协议栈会告知应用程序来自服务器的数据已经全部收到了,客户端会发送一FIN包给服务端;
过了一会儿,应用程序就会调用read来读取数据[插图]。这时,协议栈不会向应用程序传递数据[插图],而是会告知应用程序(浏览器)来自服务器的数据已经全部收到了
*通信结束后,立即删除套接字?
TCP数据段是如何通过路由器和集线器发送到对方的?
*TCP发送方如何确认发送地址?
这样一来,我们就可以判断出应该使用哪块网卡来发送包了,然后就可以在IP头部的发送方IP地址中填上这块网卡对应的IP地址。
IP层将TCP报文分别搭上IP头部、MAC头部:——这样网卡只需要将大号的包发送出去,使得网卡能够适配IP以外的其他类型的包;
将MAC头部加在IP头部的前面,整个包就完成了。到这里为止,整个打包的工作是由IP模块负责的。有人认为,MAC头部是以太网需要的内容,并不属于IP的职责范围,但从现实来看,让IP负责整个打包工作是有利的。
2.5.6 以太网的基本知识
*如何定义以太网:
尽管以太网经历了数次变迁,但其基本的3个性质至今仍未改变,即将包发送到MAC头部的接收方MAC地址代表的目的地,用发送方MAC地址识别发送方,用以太类型识别包的内容。因此,大家可以认为具备这3个性质的网络就是以太网[插图]。
*以太网给IP包添加上报头、起始帧分界符和FCS:
加上报头、起始帧分界符和FCS之后,我们就可以将包通过网线发送出去了(图2.24)。发送信号的操作分为两种,一种是使用集线器的半双工模式,另一种是使用交换机的全双工[插图]模式。
以太网的包收发操作1:使用集线器的半双工模式:为了避免信号碰撞,网卡中的PHY模块会等待一段时间后,尝试重新发送信号;等待时间——根据MAC地址生成一个随机数计算出来的;
为了通知其他设备当前线路已发生碰撞,还会发送一段时间的阻塞信号[插图],然后所有的发送操作会全部停止。等待一段时间之后,网络中的设备会尝试重新发送信号。但如果所有设备的等待时间都相同,那肯定还会发生碰撞,因此必须让等待的时间相互错开。具体来说,等待时间是根据MAC地址生成一个随机数计算出来的。
*以太网的包手法操作2:当网络拥塞时,信号碰撞的概率增加,重试发送可能又会与另外一台设备的发送操作冲突:解决办法:
当网络拥塞时,发生碰撞的可能性就会提高,重试发送的时候可能又会和另外一台设备的发送操作冲突,这时会将等待时间延长一倍,然后再次重试。以此类推,每次发生碰撞就将等待时间延长一倍,最多重试10次,如果还是不行就报告通信错误。
*网卡接收返回包后的处理:以集线器的半双工模式为例,
网卡将包转换为电信号并发送出去的过程到这里就结束了,既然讲到了以太网的工作方式,那我们不妨继续看看接收网络包时的操作过程[插图]。在使用集线器的半双工模式以太网中,一台设备发送的信号会到达连接在集线器上的所有设备。这意味着无论是不是发给自己的信号都会通过接收线路传进来,因此接收操作的第一步就是不管三七二十一把这些信号全都收进来再说。
IP层接收到数据包操作1:如果IP层发现数据包中的接收方IP不是自己,则IP模块会通过ICMP消息将错误告知发送方;
如果接收方IP地址不是自己的地址,那一定是发生了什么错误。客户端计算机不负责对包进行转发,因此不应该收到不是发给自己的包[插图]。当发生这样的错误时,IP模块会通过ICMP消息将错误告知发送方(图2.1)。ICMP规定了各种类型的消息,如表2.4所示。当我们遇到这个错误时,IP模块会通过表2.4中的Destination unreachable消息通知对方。从这张表的内容
以太网的基本架构:——即将数据包发到所有设备,然后由设备根据接收方MAC地址来判断应该接收哪些包;——忠实体现:集线器以太网的基本架构[插图]就是将包发到所有的设备,然后由设备根据接收方MAC地址来判断应该接收哪些包,而集线器就是这一架构的忠实体现,它就是负责按照以太网的基本架构将信号广播出去。下面来看看它的工作方式。
集线器会将信号发送给所有连接在它上面的线路;
接下来,信号从所有接口流出,到达连接在集线器上的所有设备。然后,这些设备在收到信号之后会通过MAC头部中的接收方MAC地址判断是不是发给自己的,如果是发给自己的就接受,否则就忽略[插图]。这样,网络包就能够到达指定MAC地址的接收方了。
交换机的包转发操作1:
*交换机的包转发操作2:
交换机根据MAC地址表查找MAC地址,然后将信号发送到相应的端口。
*交换机的包转发操作3:如果接收方的MAC地址比较特殊:
此外,如果接收方MAC地址是一个广播地址[插图],那么交换机会将包发送到除源端口之外的所有端口。
路由器的包转发操作1:路由器——基于IP设计,位于网络层;交换机——基于以太网设计,位于数据链路层;。因为路由器是基于IP设计的,而交换机是基于以太网设计的[插图]。IP和以太网的区别在很多地方都会碰到,我们稍后再具体讲,现在先来看看路由器的概况。
*路由器的包转发操作2:
端口还具有IP地址,从这个意义上来说,它和计算机的网卡是一样的。当转发包时,首先路由器端口会接收发给自己的以太网包[插图],然后查询转发目标,再由相应的端口作为发送方将以太网包发送出去。这一点和交换机是不同的,交换机只是将进来的包转发出去而已,它自己并不会成为发送方或者接收方。
*路由器的包转发操作3:
路由器会忽略主机号,只匹配网络号。
*路由器的包转发操作4:
通过路由器转发的网络包,其接收方MAC地址为路由器端口的MAC地址。
*路由器的包转发操作5:
如果只有几千台设备,遇到不知道应该转发到哪里的包,交换机可以将包发送到所有的端口上,虽然这个方法很简单粗暴,但不会引发什么问题。然而,路由器工作的网络环境就是互联网,它的规模是远远大于以太网的,全世界所有的设备都连接在互联网上,而且规模还在持续扩大,未来的互联网里到底会有多少设备,我们谁都说不准。在如此庞大的网络中,如果将不知道应该转发到哪里的包发送到整个网络上,那就会产生大量的网络包,造成网络拥塞。因此,路由器遇到不知道该转发到哪里的包,就会直接丢弃。
*路由器和交换机的关系:
到这里我们已经梳理了路由器与交换机之间的关系。简单来说,IP (路由器)负责将包发送给通信对象这一整体过程,而其中将包传输到下一个路由器的过程则是由以太网(交换机)来负责的。
局域网内的私有地址设备如何范围跟互联网?
*路由器的附加功能之一:地址转换
对于从公司内网访问互联网的包,即便其发送方私有地址和端口号没有保存在对应表中也是可以正常转发的,因为用来改写的公有地址就是地址转换设备自身的地址,而端口号只要随便选一个空闲的端口就可以了,这些都可以由地址转换设备自行判断。
如何实现互联网访问公司内网?1、对于公司内网,就算地址转换设备中没有对应内网IP的记录,也可以现场通过地址转换设备访问;2、但是反过来,如果地址转换设备中没有对应{端口, 内网IP+端口}记录,则不能从互联网访问公司内网;
不过,有时候我们希望能够从互联网访问公司内网,这需要进行一些设置才能实现。之所以无法从互联网访问内网,是因为对应表里没有相应的记录,那么我们只要事先手动添加这样的记录就可以了(图3.19)
所谓的地址转换设备,其实就是在局域网的公有网络和私有网络中间添加的一个路由器;
只要事先将地址和端口的关联信息添加到地址转换设备的对应表中,就可以从互联网访问内网中的设备了。
单模光纤技术:
*单模光纤 vs 多模光纤:
相对地,单模光纤则不会出现这样的问题。因为在纤芯传导的光线只有一条,不会因为行进距离的差异产生时间差,所以即便光纤很长,也不会产生严重的失真。光纤的最大长度也是由上述性质决定的。单模光纤的失真小,可以比多模光纤更长,因此多模光纤主要用于一座建筑物里面的连接,单模光纤则用于距离较远的建筑物之间的连接。FTTH属于后者,因此主要使用单模光纤。
*波分复用技术:
前往互联网的上行光信号和前往用户的下行光信号在光纤中混合在一起,信号会变得无法识别,因此我们需要对它们进行区分,办法是上行和下行信号采用不同波长的光。波长不同的光混合后可通过棱镜原理进行分离,因此光纤中的上行和下行信号即便混合起来也可以识别。像这样在一条光纤中使用不同的波长传输多个光信号的方式叫作波分复用。
ADSL和FTTH使用PPP消息的目的:
*隧道 vs TCP链接:
BAS除了作为用户认证的窗口之外,还可以使用隧道方式来传输网络包。所谓隧道,就类似于套接字之间建立的TCP连接。在TCP连接中,我们从一侧的出口(套接字)放入数据,数据就会原封不动地从另一个出口出来,隧道也是如此。也就是说,我们将包含头部在内的整个包从隧道的一头扔进去,这个包就会原封不动地从隧道的另一头出来,就好像在网络中挖了一条地道,网络包从这个地道里穿过去一样。
*BSA在校验用户密码后,
在校验密码之后BAS如何向用户下发TCP/IP配置信息。这里下发的配置信息包括分配给上网设备的IP地址[插图]、DNS服务器的IP地址以及默认网关的IP地址。当使用路由器连接互联网时,路由器会根据这些信息配置自身的参数。这样一来,路由器的BAS端的端口就有了公有地址[插图],路由表中也配置好了默认网关[插图],接下来就可以将包转发到互联网中了。
*1. 用户侧接入互联网路由器 -发送用户名和密码-到BAS窗口-转发给认证服务器;
接下来,网络包会到达BAS,而BAS会将MAC头部和PPPoE头部去掉,取出PPP头部以及后面的部分,然后通过隧道机制将包发送出去。最后,PPP包会沿隧道到达另一端的出口,也就是网络运营商的路由器。
防火墙的基本原理防火墙的基本思路刚才已经介绍过了,即只允许发往特定服务器中的特定应用程序的包通过,然后屏蔽其他的包。
防火墙的基本原理
防火墙的基本思路刚才已经介绍过了,即只允许发往特定服务器中的特定应用程序的包通过,然后屏蔽其他的包。
*网络包能否通过包过滤规则?
从互联网访问Web服务器时,第一个包是接收方为Web服务器,符合图5.2表中的第1行,因此允许通过。第二个包的发送方是Web服务器,但TCP控制位的规则与第二行不匹配[插图],因此符合第三行的规则,允许通过。随后的所有包要么符合第一行,要么符合第三行,因此从互联网访问Web服务器的所有包都会被允许通过。
*内置包过滤规则的普通路由器作为防火墙有以下缺点:
实际上,在防火墙允许包通过之后,就没有什么特别的机制了,因此包过滤并不是防火墙专用的一种特殊机制,而是应该看作在路由器的包转发功能基础上附加的一种功能。只不过当判断规则比较复杂时,通过路由器的命令难以维护这些规则,而且对阻止的包进行记录对于路由器来说负担也比较大,因此才出现了专用的硬件和软件。如果规则不复杂,也不需要记录日志,那么用内置包过滤功能的普通路由器来充当防火墙也是可以的。
缓存服务器工作要点:
所谓代理机制:应该就是指将DNS服务器中的客户端IP地址替换为代理对象IP地址;
实际上,缓存服务器使用的代理机制最早就是放在客户端一侧的,这才是代理的原型,称为正向代理[插图](forward proxy)。
*客户端正向代理 vs 防火墙:
此外,由于代理在转发过程中可以查看请求的内容,所以可以根据内容判断是否允许访问。也就是说,通过代理可以禁止员工访问危险的网站,或者是与工作内容无关的网站。包过滤方式的防火墙只能根据IP地址和端口号进行判断,因此无法实现这一目的。
*正向代理 vs服务端缓存服务器:
正向代理 vs 反向代理:
*客户端如何访问最近的缓存服务器?重定向法:
当使用重定向告知客户端最近的缓存服务器时,首先需要将重定向服务器注册到Web服务器端的DNS服务器上。这样一来,客户端会将HTTP请求消息发送到重定向服务器上。重定向服务器和刚才一种方法中的DNS服务器一样,收集了来自各个路由器的路由信息,并根据这些信息找到最近的缓存服务器,然后将缓存服务器的地址放到Location字段中返回响应。这样,客户端就会重新去访问指定的缓存服务器了
*使用缓存服务器的注意事项:
服务端如何同时支持多个套接字链接?
如果服务器端将接收到的电信号还原成数字信息后:
*当服务端接收到客户数据包时:
到这里,接收信号并还原成数字信息的操作就完成了,还原后的数字信息被保存在网卡内部的缓冲区中。上面这些操作都是由网卡的MAC模块[插图]来完成的。网卡的MAC模块将网络包从信号还原为数字信息,校验FCS并存入缓冲区。
*网卡还原数据包后,
协议栈的IP模块会检查IP头部,(1)判断是不是发给自己的;(2)判断网络包是否经过分片;(3)将包转交给TCP模块或UDP模块。
*服务端收到客户端发起链接的包时:
如果存在等待连接的套接字,则为这个套接字复制一个新的副本,并将发送方IP地址、端口号、序号初始值、窗口大小等必要的参数写入这个套接字中,同时分配用于发送缓冲区和接收缓冲区的内存空间。然后生成代表接收确认的ACK号,用于从服务器向客户端发送数据的序号初始值,表示接收缓冲区剩余容量的窗口大小,并用这些信息生成TCP头部,委托IP模块发送给客户端[插图]。
*进入数据收发阶段后,TCP模块的操作流程:
收到的数据块进入接收缓冲区,意味着数据包接收的操作告一段落了。接下来,应用程序会调用Socket库的read(图6.7③)来获取收到的数据,这时数据会被转交给应用程序
web服务器收到请求消息后,
*使用一般请求访问设置了用户名和密码保护的页面时:
当访问设置了用户名和密码保护的页面时,需要在HTTP请求消息中添加包含用户名和密码的头部字段(Authorization)。否则,Web服务器不会返回请求的页面内容,而是会返回一个要求提供用户名和密码的头部字段(WWW-Authenticate)消息。