网络是怎样连接的 - 读书笔记

第1章 浏览器生成消息 ---- 探索浏览器内部

1.1 生成HTTP请求消息

1.2 向DNS服务器查询IP地址

IP地址(Internet Protocol Address)

是指互联网协议地址,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

网络上,数据从一个地方传到另外一个地方,是依靠IP寻址。从逻辑上来讲,第一步,从IP得到网络号找到所属的网络,好比是去找这个人是哪个小区的;第二步从IP通过主机号找到主机在这个网络中的位置,好比是在小区里面找到这个人,网络+主机组成提高了寻址效率。

A类IP地址

用可变的7位(bit)来标识网络号,可变的24位标识主机号,最前面一位为"0",即A类地址的第一段取值介于1~126之间。A类地址通常为大型网络而提供,全世界总共只有126个A类网络,每个A类网络最多可以连接16777214台主机。

B类IP地址

用可变的14位来标识网络号,可变的16位标识主机号,前面两位是"10"。B类地址的第一段取值介于128~191之间(网络号不能以数字127开头,数字127是专门保留给诊断用的,如127.0.0.1是回送地址,用于回路测试),第一段和第二段合在一起表示网络号。B类地址适用于中等规模的网络,全世界大约有16000个B类网络,每个B类网络最多可以连接65534台主机。

C类IP地址

用可变的21位来标识网络号,可变的8位标识主机号,前面三位是"110"。C类地址的第一段取值介于192~223之间,第一段、第二段、第三段合在一起表示网络号。最后一段标识网络上的主机号。C类地址适用于校园网等小型网络,每个C类网络最多可以有254台主机。

子网掩码(subnet mask)

作用是将某个IP地址划分成网络地址和主机地址两部分。

子网掩码和IP一样是一个32位的2进制数,左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;右边是主机位,用二进制数字“0”表示,0的数目等于主机位的长度。目的是为了让掩码与IP地址做 & 运算时用0遮住主机号,而不改变网络号。而且很容易通过0的位数确定子网的主机数(2的主机位数次方-2,因为主机号全为1时表示该网络广播地址,全为0时表示该网络的网络号,这是两个特殊地址)。

只有在一个网络号下的计算机之间才能“直接”互通(局域网传输,

速度主要取决于路由器、网线、网卡等),不同网络号的计算机要通过网关(Gateway)才能互通(广域网传输,速度还受贷款影响)。

网关(Gateway)

https://zhuanlan.zhihu.com/p/165142303

IPV6

ipv4 32位,ipv6 128位。IPV6的话是没有子网掩码的概念。IPV6是端到端的连接通信,不需要子网了。但是,目前似乎更多都是在IPV4上使用隧道的方式使用IPV6。完全消灭IPV4还需要相当长的时间,子网掩码目前还是要的。

格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16b,以十六进制表示,例如:

ABCD:EF01:2345:6789:ABCD:EF01:2345:6789

为什么域名和IP不能二选一?
  1. IP难记忆,域名好记
  2. IP地址4字节,域名则远远高于这个量级,增加路由器压力。
DNS

我们使用的方案是让人来使用名称,让路由器来使用IP地址。为了填补两者之间的障碍,需要有一个机制能够通过名称来查询IP地址,或者通过IP地址来查询名称,这样就能够在人和机器双方都不做出牺牲的前提下完美地解决问题。这个机制就是DNS。

Socket库提DNS解析器

对于DNS服务器,我们的计算机上一定有相应的DNS客户端,而相当于DNS客户端的部分称为DNS解析器,或者简称解析器。通过DNS查询IP地址的操作称为域名解析。解析器实际上是一段程序,它包含在操作系统的Socket库中,Socket库是用于调用网络功能的标准组件集合。

解析器的原理:

// 应用程序
<内存地址> = gethostbyname("www.baidu.com");

// Socket
gethostbyname {
  生成发送给DNS查询消息,并发送
  接收响应消息并将IP放到缓存地址中
}

向DNS服务器发送消息时,我们当然也需要知道DNS服务器的IP地址。只不过这个IP地址是作为TCP/IP的一个设置项目事先设置好的,不需要再去查询了。比如Windows “首选DNS服务器”、“备用DNS服务器”,Mac 网络 → 高级 → DNS。

1.3 全世界DNS服务器的大接力

DNS基本原理

DNS服务器的基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。

DNS服务器中的所有信息都是按照域名以分层次的结构来保存的。一台DNS服务器不可能存储所有信息,所以将信息分布保存在多台DNS服务器中,这些DNS服务器相互接力配合,从而查找出要查询的信息。

如何找到DNS服务器中存放的信息。这里的关键在于如何找到我们要访问的Web服务器的信息归哪一台DNS服务器管。

下级域的DNS服务器的IP地址注册到它们的上级DNS服务器中。负责管理lab.glasscom.com这个域的DNS服务器的IP地址需要注册到glasscom.com域的DNS服务器中,而glasscom.com域的DNS服务器的IP地址又需要注册到com域的DNS服务器中。

根域

似乎com、jp这些域(称为顶级域)就是最顶层了,但实际上并非如此。在互联网中,com和jp的上面还有一级域,称为根域。根域不像com、jp那样有自己的名字,因此在一般书写域名时经常被省略,如果要明确表示根域,应该像 www.lab.glasscom.com.这样在域名的最后再加上一个句点,而这个最后的句点就代表根域。

根域的DNS服务器中保管着comjp等的DNS服务器的信息。由于上级DNS服务器保管着所有下级DNS服务器的信息,所以我们可以从根域开始一路往下顺藤摸瓜找到任意一个域的DNS服务器。除此之外还需要完成另一项工作,那就是将根域的DNS服务器信息保存在互联网中所有的DNS服务器中。这样一来,任何DNS服务器就都可以找到并访问根域DNS服务器了。因此,客户端只要能够找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺藤摸瓜找到位于下层的某台目标DNS服务器,分配给根域DNS服务器的IP地址在全世界仅有13个。

DNS缓存

现实中上级域和下级域有可能共享同一台DNS服务器。在这种情况下,访问上级DNS服务器时就可以向下跳过一级DNS服务器,直接返回再下一级DNS服务器的相关信息。

有时候并不需要从最上级的根域开始查找,因为DNS服务器有一个缓存功能,如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始向下进行。相比每次都从根域找起来说,缓存可以减少查询所需的时间。

当要查询的域名不存在时,“不存在”这一响应结果也会被缓存。这样,当下次查询这个不存在的域名时,也可以快速响应。

缓存中的信息有可能是不正确的。因此,DNS服务器中保存的信息都设置有一个有效期,超过有效期后会从缓存中删除。而且会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的DNS服务器。

1.4 委托协议栈发送消息

数据收发概述

在进行收发数据操作之前,双方需要先建立起这条管道才行。建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字。

首先,服务器一方先创建套接字,然后等待客户端向该套接字连接管道。当服务器进入等待状态时,客户端就可以连接管道了。当双方的套接字连接起来之后,通信准备就完成了。接下来,只要将数据送入套接字就可以收发数据了。

管道在连接时是由客户端发起的,但在断开时可以由客户端或服务器任意一方发起。

  • 描述符:应用程序用来识别套接字的机制
  • IP地址和端口号:客户端和服务器之间用来识别对方套接字的机制

实际负责收发消息的是协议栈、网卡驱动和网卡,只有这3者相互配合,数据才能够在网络中流动起来。

第2章 用电信号传输TCP/IP ---- 探索协议栈和网卡

2.1 创建套接字

协议栈的内部结构

操作系统靠网络控制软件(协议栈)和网络硬件(网卡)将浏览器的消息发送给服务器的。

下面一半是用IP协议控制网络包收发操作的部分。在互联网上传送数据时,数据会被切分成一个一个的网络包[插图],而将网络包发送给通信对象的操作就是由IP来负责的。IP中还包括ICMP协议和ARP协议。ICMP用于告知网络包传送过程中产生的错误以及各种控制消息,ARP用于根据IP地址查询相应的以太网MAC地址。

IP下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收的操作。

什么是套接字

在协议栈内部有一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信息,例如通信对象的IP地址、端口号、通信操作的进行状态等,可以理解这些控制信息就是套接字。协议栈是根据套接字中记录的控制信息来工作的。创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态。

2.2 连接服务器

连接操作的第一步是在TCP模块处创建表示连接控制信息的头部。

通过TCP头部中的发送方和接收方端口号可以找到要连接的套接字。

当TCP头部创建好之后,接下来TCP模块会将信息传递给IP模块并委托它进行发送。IP模块执行网络包发送操作后,网络包就会通过网络到达服务器,然后服务器上的IP模块会将接收到的数据传递给TCP模块,服务器的TCP模块根据TCP头部中的信息找到端口号对应的套接字,也就是说,从处于等待连接状态的套接字中找到与TCP头部中记录的端口号相同的套接字就可以了。当找到对应的套接字之后,套接字中会写入相应的信息,并将状态改为正在连接。上述操作完成后,服务器的TCP模块会返回响应,这个过程和客户端一样,需要在TCP头部中设置发送方和接收方端口号以及SYN比特。此外,在返回响应时还需要将ACK控制位设为1,这表示已经接收到相应的网络包。网络中经常会发生错误,网络包也会发生丢失,因此双方在通信时必须相互确认网络包是否已经送达,而设置ACK比特就是用来进行这一确认的。接下来,服务器TCP模块会将TCP头部传递给IP模块,并委托IP模块向客户端返回响应。

网络包就会返回到客户端,通过IP模块到达TCP模块,并通过TCP头部的信息确认连接服务器的操作是否成功。如果SYN为1则表示连接成功,这时会向套接字中写入服务器的IP地址、端口号等信息,同时还会将状态改为连接完毕。到这里,客户端的操作就已经完成,但其实还剩下最后一个步骤。刚才服务器返回响应时将ACK比特设置为1,相应地,客户端也需要将ACK比特设置为1并发回服务器,告诉服务器刚才的响应包已经收到。当这个服务器收到这个返回包之后,连接操作才算全部完成。

2.3 收发数据

将HTTP请求消息交给协议栈

协议栈并不关心应用程序传来的数据是什么内容。应用程序在调用write时会指定发送数据的长度,在协议栈看来,要发送的数据就是一定长度的二进制字节序列而已。

协议栈并不是一收到数据就马上发送出去,而是会将数据存放在内部的发送缓冲区中,需要积累一定数量的数据才会发送,否则导致网络效率低下。

发送数据因素:数据长度 & 时间

数据长度:

  • MTU:协议栈并不是一收到数据就马上发送出去,而是会将数据存放在内部的发送缓冲区中,
  • MSS:除去头部之后,一个网络包所能容纳的TCP数据的最大长度。

当从应用程序收到的数据长度超过或者接近MSS时再发送出去,就可以避免发送大量小包的问题了。

时间:

当应用程序发送数据的频率不高时,如果每次都等到长度接近MSS时再发送,可能会因为等待时间太长而造成发送延迟,这种情况下,即便缓冲区中的数据长度没有达到MSS,也应该发送出去。因此协议栈的内部有一个计时器,当经过一定时间之后,就会把网络包发送出去。

PS:二进制字节序列以起始帧分界符(Start Frame Delimiter,SFD)开头,以帧校验序列(Frame Check Sequence,FCS)结尾。

对较大的数据进行拆分

当发送的数据较大时,发送缓冲区中的数据会被以MSS长度为单位进行拆分,拆分出来的每块数据会被放进单独的网络包中。

使用ACK号确认网络包已收到

TCP具备确认对方是否成功收到网络包,以及当对方没收到时进行重发的功能,因此在发送网络包之后,接下来还需要进行确认操作。

序号和ACK号的用法

PS:在实际的通信中,序号并不是从1开始的,而是需要用随机数计算出一个初始值,这是因为如果序号都从1开始,通信过程就会非常容易预测,有人会利用这一点来发动攻击。

重传网络包机制很请打,但是如果发生网络中断、服务器宕机等问题,那么无论TCP怎样重传都不管用。这种情况下,无论如何尝试都是徒劳,因此TCP会在尝试几次重传无效之后强制结束通信,并向应用程序报错。

根据网络包平均往返时间调整ACK号等待时间

。。

使用窗口有效管理ACK号

所谓滑动窗口,就是在发送一个包之后,不等待ACK号返回,而是直接发送后续的一系列包。这样一来,等待ACK号的这段时间就被有效利用起来了。

频率超过接收方处理能力的情况:

当接收方的TCP收到包后,会先将数据存放到接收缓冲区中。然后,接收方需要计算ACK号,将数据块组装起来还原成原本的数据并传递给应用程序,如果这些操作还没完成下一个包就到了也不用担心,因为下一个包也会被暂存在接收缓冲区中。如果数据到达的速率比处理这些数据并传递给应用程序的速率还要快,那么接收缓冲区中的数据就会越堆越多,最后就会溢出。缓冲区溢出之后,后面的数据就进不来了,因此接收方就收不到后面的包了,这就和中途出错的结果是一样的,也就意味着超出了接收方处理能力。我们可以通过下面的方法来避免这种情况的发生。首先,接收方需要告诉发送方自己最多能接收多少数据,然后发送方根据这个值对数据发送操作进行控制,这就是滑动窗口方式的基本思路。

窗口大小:能够接收的最大数据量,它是TCP调优参数中非常有名的一个。

ACK与窗口的合并(延迟确认机制)

AKC正常应该在接收端收到数据后立马返回给发送端,而窗口数据更新应该是在接收端取数据给应用程序的时候,如果分开发送则浪费网络资源,因此,接收方在发送ACK号和窗口更新时,并不会马上把包发送出去,而是会等待一段时间,在这个过程中很有可能会出现其他的通知操作,这样就可以把两种通知合并在一个包里面发送了。

https://blog.csdn.net/yuqingzhude/article/details/88974669

接收HTTP响应消息

发送HTTP请求消息后,接下来还需要等待Web服务器返回响应消息。对于响应消息,浏览器需要进行接收操作,这一操作也需要协议栈的参与。

简单总结

首先,协议栈会检查收到的数据块和TCP头部的内容,判断是否有数据丢失,如果没有问题则返回ACK号。然后,协议栈将数据块暂存到接收缓冲区中,并将数据块按顺序连接起来还原出原始的数据,最后将数据交给应用程序。

2.4 从服务器断开并删除套接字

数据发送完毕后断开连接

协议栈在设计上允许任何一方先发起断开过程,协议栈会生成包含断开信息的TCP头部,具体来说就是将控制位中的FIN比特设为1。

删除套接字

和服务器的通信结束之后,用来通信的套接字也就不会再使用了,这时我们就可以删除这个套接字了。不过,套接字并不会立即被删除,而是会等待一段时间之后再被删除。

为了防止误操作:假如客户端先断开操作,返回给服务端最后一个ACK号没有成功接收,服务端可能会重发一次FIN,如果套接字被删除,对应的端口号就会被释放,如果这时候有新的套接字创建,并恰巧使用了这个端口号,于是这个FIN就会错误地跑到新套接字里面,新套接字就开始执行断开操作了。协议中对于这个等待时间没有明确的规定,一般来说会等待几分钟之后再删除套接字。

数据收发小结

数据收发操作的第一步是创建套接字。一般来说,服务器一方的应用程序在启动时就会创建好套接字并进入等待连接的状态。客户端则一般是在用户触发特定动作,需要访问服务器的时候创建套接字。创建套接字之后,客户端会向服务器发起连接操作。

  • 客户端会生成一个SYN为1的TCP包并发送给服务器(图①)。这个TCP包的头部还包含了客户端向服务器发送数据时使用的初始序号,以及服务器向客户端发送数据时需要用到的窗口大小。
  • 当这个包到达服务器之后,服务器会返回一个SYN为1的TCP包(图②)。和图①一样,这个包的头部中也包含了序号和窗口大小,此外还包含表示确认已收到包①的ACK号。
  • 当这个包到达客户端时,客户端会向服务器返回一个包含表示确认的ACK号的TCP包(图③)。到这里,连接操作就完成了,双方进入数据收发阶段。

TCP的整体流程

2.5 IP与以太网的包收发操作

包的基本知识

包是由头部和数据两部分构成的。头部包含目的地址等控制信息,可以把它理解为快递包裹的面单;头部后面就是委托方要发送给对方的数据,也就相当于快递包裹里的货物。创建包的过程就是生成含有正确控制信息的头部,然后再附加上要发送的数据。

路由器 & 集线器
  • 路由器(IP协议):使用IP头部,根据目标地址判断下一个路由器的位置
  • 集线器(以太网协议):使用MAC头部,在子网中将网络包传输到下一个路由

PS:IP头部用于指明目的地,MAC头部负责数据在途中路由之间转运。IP头部不变,MAC头部每次转发都被改写。

包传递过程

1、封装好的包会被交给网络硬件(网卡),传递给网卡的网络包是由一连串0和1组成的数字信息,网卡会将这些数字信息转换为电信号或光信号,并通过网线(或光纤)发送出去,然后这些信号就会到达集线器、路由器等转发设备。

2、包会被发往最近的网络转发设备。当到达最近的转发设备之后,转发设备会根据头部中的信息判断接下来应该发往哪里。这个过程需要用到一张表,这张表里面记录了每一个地址对应的发送方向,也就是按照头部里记录的目的地址在表里进行查询,并根据查到的信息判断接下来应该发往哪个方向,经过多个转发设备的接力之后,包最终就会到达接收方的网络设备。

ARP查询路由器的MAC地址

在以太网中,有一种叫作广播的方法,可以把包发给连接在同一以太网中的所有设备。ARP就是利用广播对所有设备提问。

为了减少网络网络中的ARP包,ARP是有缓存的,并且为了防止IP地址发生改变,一般几分钟后就会被删除。

以太网的基本知识

以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术,这种网络的本质其实就是一根网线。

性质:

  • 将包发送到MAC头部的接收方MAC地址代表的目的地
  • 用发送方MAC地址识别发送方
  • 用以太类型识别包的内容
IP包转换成电或光信号

IP生成的网络包只是存放在内存中的一串数字信息,没有办法直接发送。因此需要将数字信息转换为电或光信号,负责执行这一操作的是网卡。

  • 网卡的ROM中保存着全世界唯一的MAC地址,这是在生产网卡时写入的。
  • 网卡中保存的MAC地址会由网卡驱动程序读取并分配给MAC模块。

1、网卡驱动从IP模块获取包之后,会将其复制到网卡内的缓冲区中,然后向MAC模块发送发送包的命令。

2、MAC模块将包从缓冲区中取出,并在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。

网卡中的

  • MAC模块:生成通用信号。
  • PHY(MAU)信号收发模块:转换成可在网线中传输的格式(电信号、光信号…),并通过网线发送出去。

2.6 UDP协议的收发操作

不需要重发的数据用UDP发送更高效,TCP之所以设计复杂是因为要实现可靠性。

使用UDP的场景:

  • 控制用的短数据
  • 音频和视频数据

Q:在收到ACK号之前继续发送下一个包的方式叫什么?

滑动窗口方式

第3章 从网线到网络设备 ---- 探索集线器、交换机和路由器

3.1 信号在网线和集线器中传输

防止网线中的信号衰减

信号到达集线器的时候并不是跟刚发送出去的时候一模一样。集线器收到的信号有时会出现衰减。信号在网线的传输过程中,能量会逐渐损失。网线越长,信号衰减就越严重。

局域网网线使用的是双绞线,其中“双绞”的意思就是以两根信号线为一组缠绕在一起,这种拧麻花一样的设计是为了抑制噪声的影响。

产生噪声的原因是网线周围的电磁波,影响网线的电磁波分为两种。一种是由电机、荧光灯、CRT显示器等设备泄漏出来的电磁波,另一种电磁波是从网线中相邻的信号线泄漏出来的。

信号线是用金属做成的,当电磁波接触到信号线时,会沿电磁波传播的右旋方向产生电流,这种电流会导致波形发生失真。如果我们将信号线缠绕在一起,信号线就变成了螺旋形,其中两根信号线中产生的噪声电流方向就会相反,从而使得噪声电流相互抵消,噪声就得到了抑制。

集线器将信号发送给所有连接在它上面的线路

信号到达集线器的PHY(MAU)模块后,会进入中继电路。中继电路的基本功能就是将输入的信号广播到集线器的所有端口上。当然,也有一些产品具有信号整形、错误抑制等功能,但基本上就是将输入的信号原封不动地输出到网线接口。

3.2 交换机的包转发操作

交换机根据地址表进行转发

交换机将包存入缓冲区后,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录了。MAC地址表主要包含两个信息,一个是设备的MAC地址,另一个是该设备连接在交换机的哪个端口上。

交换机根据MAC地址表查找MAC地址,然后将信号发送到相应的端口。

MAC地址表的维护

在转发包的过程中需要对地址表进行维护,维护分位两种

  1. 收到包时,将发送方的Mac地址以及其输入端口的号码写入MAC地址表中。交换机每次收到包时都会执行这个操作,因此只要某个设备发送过网络包,它的MAC地址就会被记录到地址表中。
  2. 删除地址表中某条记录的操作,这是为了防止设备移动时产生问题,记录从地址表中删除的时间一般为几分钟。

交换机的全双工模式可以同时发送和接收信号。

3.3 路由器的包转发操作

路由器的基本知识

路由器在转发包时,首先会通过端口将发过来的包接收进来,这一步的工作过程取决于端口对应的通信技术。对于以太网端口来说,就是按照以太网规范进行工作,而无线局域网端口则按照无线局域网的规范工作,总之就是委托端口的硬件将包接收进来。接下来,转发模块会根据接收到的包的IP头部中记录的接收方IP地址,在路由表中进行查询,以此判断转发目标。然后,转发模块将包转移到转发目标对应的端口,端口再按照硬件的规则将包发送出去,也就是转发模块委托端口模块将包发送出去的意思。

路由器的各个端口都具有MAC地址和IP地址。

由表中子网掩码为0.0.0.0的记录表示“默认路由”。

1.局域网中使用的双绞线中为什么要将信号线缠绕在一起?

为了抑制噪声的影响

2.将输入的信号广播到所有端口上的设备是交换机还是集线器?

集线器

3.用来指定网络号和主机号比特数的值叫什么?

子网掩码

4.将大网络包进行拆分的功能叫什么?

分片

第4章 通过接入网进入互联网内部

Q:光纤的通信速率之所以更快,是因为光信号的传播速度比电信号要快。

A:电信号和光信号传播的速度大体上相同,之所以电缆不如光纤通信速率高,是因为电信号在提升通信速率的同时,其衰减率也会提高(信号在传播过程中减弱),导致信号无法传到目的地。相对地,光信号本来的衰减率就很低,提高通信速率也并不会提高衰减率。此外,光纤还不受电磁噪声的影响,因此光纤能够进行高速通信。

ADSL接入网的结构和工作方式

距离的不同和路由的维护方式,就是互联网与家庭、公司网络之间最主要的两个不同点。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值