Poison

《网络是怎样连接的》笔记

浏览器生成消息

  • URL: Uniform Resource Locator,统一资源定位符。
  • URL: http://www.lab.glasscom.com/dir/,我们可以这样理解,以 “/” 结尾代表 /dir/ 后面本来应该有的文件名被省略了。根据 URL 的规则,文件名可以像前面这样省略。我们会在服务器上事先设置好文件名省略时要访问的默认文件名。这个设置根据服务器不同而不同,大多数情况下是 index.html 或者 default.htm 之类的文件名。
  • URI: Uniform Resource Identifier,统一资源标识符。
  • 关于 HTTP 的 HEAD 方法,在我们仅仅需要 HTTP 响应头信息的时候就可以使用,比如不下载音视频的前提下通过 HEAD 方法查看一下字节数。这里推荐一个小工具 POSTMAN
  • 一般当我们访问 Web 服务器获取网页数据时,使用的就是 GET 方法。PUT、DELETE 等方法现在常用于 RESTful API 的设计中,在手机 App 和后端服务器交互时就会经常用到。
  • 关于 GET 请求 URL 的最大长度,不同浏览器和服务器有不同的限制,可参考 Maximum URL Size in HTTP GET Request
  • 关于 ETag 这个字段,可以用来提供上次响应与下次请求之间的关联信息。上次响应中,服务器会通过 ETag 向客户端发送一个唯一标识,在下次请求中客户端可以通过 If-Match、If-None-Match、If-Range 字段将这个标识告知服务器,这样服务器就知道该请求和上次的响应是相关的。这个字段的功能和 Cookie 是相同的,但 Cookie 是网景(Netscape)公司自行开发的规格,而 Etag 是将其进行标准化后的规格。
  • HTTP 状态码摘要信息如下:
    • 1xx 告知请求的处理进度和情况
    • 2xx 成功
    • 3xx 表示需要进一步操作
    • 4xx 客户端错误
    • 5xx 服务器错误
  • 关于 DNS,可以参考 那些你未曾注意的DNS细节

用电信号传输 TCP/IP 数据

  • 最早的 TCP/IP 协议原型设计相当于现在的 TCP 和 IP 在一起的样子,后来才拆分为 TCP 和 IP 两个协议。
  • TCP 两端并没有像绳子一样的真实连接,只是两端都在维护着连接状态而已。
  • 我们平时在 console 使用 netstat 命令看到的 0.0.0.0 表示本机上的所有 IP 地址。
  • IP 地址实际上并不是分配给计算机的,而是分配给网卡的,因此当计算机上存在多块网卡时,每一块网卡都会有自己的 IP 地址。在这里可以想到阿里云的 ECS 能看到公网的网络接口,而腾讯云的 CVM 只能看到内网的网络接口。是因为 CVM 实例不与公网直接通信,而通过 NAT 网关访问外网,应答请求。
  • MAC: Media Access Control 的缩写。以太网的每个帧前面都有报头和起始帧分界符(SFD),报头占前 7 字节,起始帧分界符占 1 字节,报头用于 “唤醒” 接收适配器,并且将它们的时钟和发送方的时钟同步。起始帧分界符的最后两个比特为 11,即警告适配器,“重要的内容” 就要来了。
  • 发送和接收同时并行的方式叫作 “全双工”,相对地,某一时刻只能进行发送或接收其中一种操作的叫作 “半双工”。
  • 根据以太网的规格,两台设备之间的网线不能超过 100 米,在这个距离内极少会发生错误。这是双绞线的情况,如果采用光纤可以更长,而且错误率不会上升。在使用集线器的半双工模式中,当发送信号时,接收线路不应该有信号进来,但情况不总是尽如人意,有很小的可能性出现多台设备同时进行发送操作的情况,一旦发生这种情况,两组信号就会发生叠加,无法彼此区分出来,这就是所谓的信号碰撞。这种情况下,继续发送信号是没有意义的,因此发送操作会终止。为了通知其他设备当前线路已发生碰撞,还会发送一段时间的阻塞信号,然后所有的发送操作会全部停止。等待一段时间后,网络中的设备会尝试重新发送信号。等待时间是根据 MAC 地址生成一个随机数计算出来的。当网络拥塞时,发生碰撞的可能性就会提高,重试发送的时候可能又会和另外一台设备的发送操作冲突,这时会将等待时间延长一倍,然后再次重试。以此类推,最多重试 10 次,如果还是不行就报告通信错误。上述都是半双工的情况,在全双工模式中不需要像半双工模式这样考虑这么多复杂的问题,即便接收线路中有信号进来,也可以直接发送信号。
  • 在接收帧时,如果 FCS 校验没有问题,接下来就要看一下 MAC 头部中接收方 MAC 地址与网卡在初始化时分配给自己的 MAC 地址是否一致,以判断这个帧是不是发给自己的,如果不是自己的帧就直接丢弃。但这里也有特例,我们可以让网卡不检查帧的接收方地址,不管是不是自己的帧都统统接收下来,这种模式叫做 “混杂模式”(Promiscuous Mode)。好吧,笔者第一次在代码里看见 Promiscuous 时,随手到谷歌翻译一查,翻译过来是 “淫乱”,当时就凌乱了,finalspeed 中就用到了混杂模式。不过笔者认为 finalspeed 的代码写得比较乱,看了一些就没再看了。

从网线到网络设备

  • 交换机并不只是简单地让信号流过,而是先接收信号并将其还原为数字信息,然后再重新转换成信号并发送出去的过程。交换机是基于以太网规格工作的设备,而路由器是基于 IP 工作的。交换机时通过 MAC 头部中的接收方 MAC 地址来判断转发目标的,而路由器则是根据 IP 头部中的 IP 地址来判断的。交换机在地址表中只匹配完全一致的记录,而路由器则会忽略主机号部分,只匹配网络号部分。
  • 交换机端口的 MAC 模块不具有 MAC 地址。
  • 当交换机发现一个包要发回到原端口时,就会直接丢弃这个包。当在地址表中找不到指定的 MAC 地址时,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。
  • 在以太网中,当没有数据在传输时,网络中会填充一种被称为连接脉冲的脉冲信号。在没有数据信号时就填充连接脉冲,这使得网络中一直都有一定的信号流过,从而能够检测对方是否在正常工作,或者说网线有没有正常连接。以太网设备的网线接口周围有一个绿色的 LED 指示灯,它表示是否检测到正常的脉冲信号。如果绿灯亮,说明 PHY(MAU) 模块以及网线连接正常。
  • 路由器的各个端口都具有 MAC 地址和 IP 地址。
  • 路由器在进行匹配时首先寻找网络号比特数最长的一条记录,如果路由表中存在网络号长度相同的多条记录,这时,需要根据跃点计数的值来进行判断。跃点计数越小说明该路由越近,因此应选择跃点计数较小的记录。
  • 路由器中子网掩码为 0.0.0.0 的记录表示 “默认路由”。
  • 在路由器更新 TTL 和分片的过程中,IP 头部的内容发生了改变,因此必须重新计算校验和。
  • 在内网中可用作私有地址的范围仅限以下这些:
    • 10.0.0.0 ~ 10.255.255.255
    • 172.16.0.0 ~ 172.31.255.255
    • 192.168.0.0 ~ 192.168.255.255
  • NAT,上面讲腾讯云的 CVM 时提了下,细节可参考词条链接。关于 tcptwrecyle 的使用,可参考 优化Linux NAT网关

通过接入网进入互联网内部

  • 电信号和光信号传播的速度大体上相同,之所以电缆不如光纤通信速率高,是因为电信号在提升通信速率的同时,其衰减率也会提高,而光信号本来的衰减率就很低,提高通信速率也并不会提高衰减率。此外,光纤还不受电磁噪声的影响,因此光纤能够进行高速通信。
  • 双绞线的极限距离时 100 米,但光纤的连接距离可以长达几公里。
  • ADSL: Asymmetric Digital Subscriber Line, 不对称数字用户线。它是一种利用架设在电线杆上的金属电话线来进行高速通信的技术,它的上行方向(用户到互联网)和下行方向(互联网到用户)的通信速率时不对称的。记得笔者家里起初安装网络时就是使用的 ADSL,并且速率只有 1Mbps,当时还不懂为什么下载速度最高只能达到 128 KB/s,后来才知道原因是 1 Byte 等于 8 bit 啊。
  • 关于分离器:在信号从用户端发送出去时,电话和 ADSL 信号只是同时流到一条线路上而已,分离器实际上并没有做什么事。分离器的作用其实在相反的方向,也就是信号从电话线传入的时候。这时,分离器需要将电话和 ADSL 的信号进行分离。分离器将一定频率以上的信号过滤掉,也就是过滤掉了 ADSL 使用的高频信号,这样以来,只有电话信号才会传入电话机,但对于另一头的 ADSL Modem,则是传输原本的混合信号给它。ADSL Modem 内部已经具备将 ADSL 频率外的信号过滤掉的功能,因此不需要在分离器进行过滤。
  • 光纤由一种双层结构的纤维状透明材质(玻璃和塑料)构成,ADSL 信号是由多个频段的信号组成的,比较复杂,但光信号却非常简单,亮表示 1,暗表示 0。数字信息并不能一下子变成光信号,而是先将数字信息转换成电信号,然后再将电信号转换成光信号。

Web 服务器程序解释请求消息并作出响应

  • 在 HTTP1.0 中,是服务器先发起断开操作。

参考书目:
《计算机网络 自顶向下方法》
《TCP/IP详解 卷1 协议》