简单解释, 当你的操作系统连接特定 HTTP 服务, 比如 http://www.gstatic.com/generate_204, 如果能够返回 204 状态码, 那就基本说明你连接上网络了. 如果被 301, 说明你已经有 IP, 但是你的网络可能是一个付费网络, 会跳转到一个页面让你付钱/登陆. 如果无法解析域名/创建 TCP 连接, 说明你的三层/四层网络存在问题, 再下去多半是网线没插之类的物理层问题.
至于 TCP/UDP(一般主要是为了 DNS) 无法创建, 有可能是因为没路由, 或者是 SYN 过去没包回来超时, 或者是 SYN 飞过去, 中间路由 ICMP 告诉你目标不可达; 如果是创建 socket 失败说明可能没三层 IP, 没 IP 可能是因为没网卡/没插网线/二层里没有 DHCP 或者没有设置 IP.
但是你看到这些没明白, 你看下面可能都不见得明白. 很多人自以为明白上面那些内容, 实际上不少观点还是错误的.
首先就是很经典的五层网络模型:
首先从物理层开始说.
所谓物理层, 就是双绞线/光纤/无线电等传输介质. 比方说电脑上显示的「网线已经拔出」, 就说明物理层没有建立链接. 还有就是双绞线以太网的速度协商, 光模块的功率协商, 各种无线网络的时分/码分/空分/功率协商技术都是物理层的体现.
无线网络的频率,信噪比, 带宽, 物理模式
光模块的信息, 包含了波长, 电压, 功率, 发射/接收功率(信噪比)
有线网络的状态
接下来就是媒体访问控制层, 也即是 MAC 层, 简称二层, 代表的以太网设备有交换机/无线AP.
首先要确定, 我们的以太网是一个「分组传输」机制, 也就是数据流(stream), 会被切成分组(packet), 而每个数据分组都有可能因为各种问题, 比如你的网线质量不好, 然后产生错误被分组内的校验和检查出来, 然后被交换机丢掉; 与分组传输机制对应的就是「电路交换」, 比如工作在电路域的电话, 本质上是机器代替人工帮你完成了从你的电话到你交流的人的线.
而分组在二层上的大小, 被称为 MTU, 最大传输单元, 超过这个大小, 就会尝试调整或在三层进行拆分;所有以太网二层设备都会有一个能接受的最大 MTU, 和一个标记设备的 mac 地址. 这个地址的前 24bit 是 vendor ID, 厂商编号
这一层包含了著名的 ARP 协议(地址解析协议), 简单来说就是用于完成 IP 地址-> mac 物理地址的转换, 就好比教室里你喊一声某个同学的名字, 然后那个同学/知道那个同学的人就会回答你他所在的座位坐标. 如果多个 mac 地址对应了一个 IP 地址, 我们就说 IP 地址发生了冲突, 好比两个人坐在了一个位置上.
以及还有 IPv4 里面非常基础的 DHCP 协议, 这个协议好比一个老师, 当你没有就坐(没有分配到 IP 地址)的时候, 可以听到老师(们)宣布分配座位的广播, 然后你选择一个选择老师的分配广播, 请求这个老师为自己分配位置. 当然这个位置是有时间限制的, 到这个期限之前就要提出续约, 当然老师也可要求你改变位置. 当然你自己也可以坐在一个固定位置, 相当于手工设置 IP(但是如果和别人不在一个子网(subnet)里面, 除非有人充当 arp proxy 的角色, 不然你就无法和不在一个子网的同一个二层人进行 IP 的传输.
DHCP 的状态机
其中大多数操作系统当检测到链接到一个二层但是没有 DHCP 的时候, 就会使用一个特殊的 link-local 机制, 为自己分配一个 169.254.0.0/16 的地址, 后面的 /16 是根据自己 mac 地址的填充. 所以当你把两台电脑直接用 RJ45 网线连接在一起的时候, 理论上常见的操作系统的 DHCP client 都会配置上这个地址, 从而允许通过 IP 连接.
而 IPv6 不主张使用 DHCP 的分配模式, 而是使用类似 link local 那样的自己设置+随机生成的模式, 让设备拿到, 这套机制叫 SLAAC, 借助的协议叫做 NDP, 其中需要二层网络里面有一个三层路由器宣告自己的 IPv6 路由, 大概就是比如说 2001:2333::2a4e/48是你的路由器, 他告诉这个网络的人他有到 2000::/3(差不多是 IPv6 的公网地址) 的路由, 那么你就可以通过他的地址前缀 2001:2333::/48 给自己取名字. 其中一个相对固定的名字是通过你的 mac 地址来确定, 而因为 SLACC 地址前缀都只要有 /64, 所以就需要一套机制完成 48bit 的 mac 地址到 64bit, 即 EUI64. 除了这个地址之外就是一些临时地址, 直接随机生成, 用于提供 IPv6 的匿名性.
所以简单说二层的意义就是让一堆在不同物理层的设备连接在一起交换数据, 同时为各种三层上的数据连接/交换做准备.
然后就是三层, 也叫做 IP 层. 其实我们在以太网二层里面讲了很多三层的信息. 其实简单的说一二层的各种作用就是让我能够拿到 IP 地址, 并且能和其他 IP 地址的设备进行通信:
我们通过 DHCP/PPPo/SLAAC 拿到 IP 地址, 但是不足以说明我们真的能连上互联网. 所以三层的重点就在于路由. 所谓路由就好比刚才那个给你分配地址的 DHCP 老师, 他告诉你, 如果你要访问别的班级, 那么你需要把信息传达给一个中介, 这个中介很多时候就是这个老师, 有的时候就是别的同学; 这个中介通常叫做网关, 而作为一个萌新, 你通常也不会有别的路由, 所以这个网关带来的路由意义就很重要, 通常就叫做「默认路由」, 刚才提到的 2000::/3, 就是 IPv6 里面最重要的一类「默认路由」.
然而这个经过路由后面的交换层不一定就是你要访问的对象, 还要经过别的路由器. 通常来说就需要各种路由协议让各个路由器之间互相交换信息, 这里根据很多路由协议, 比如基于距离向量的 RIP, 还有基于图论 Dijkstra 最短路径算法的 OSPF, 还有像是 IS-IS 协议. 当然这些都是 AS 内的协议, 在今天互联网起着决定性作用的协议还是 BGP 协议. 同时 BGP 协议关联的还有 IP 地址块的分配.
然而三层本身还是有个问题: 他仍然是一个分组交换. 换句话说, 你发一个 ICMP echo(也就是经常说的 ping 包), 中间路由任何一条丢了就没了. 但是你访问的网页所建立的连接 就不能因为一个包丢了就完全坏了, 所以我们还需要一层.
这就是传输层, 最典型的协议就是 TCP 和 UDP.
先说 UDP, UDP 就是在 IP 包的基础上加上端口机制, UDP 本身没有连接的概念, 也就是有一说一, 直接发了就行. 然后从你自己的一个信箱(端口)发了之后就到了另外一个端口(信箱), 这样对面的应用就能读这个信箱.
而 TCP 不仅仅是在 IP 包上加了端口那么简单, 更重要的是他提供了一种可靠的交付方式, 即 ARQ 机制, 换句话说两边建立连接之后发送的所有内容, 都会有个「签收」机制保证到达, 如果不到的话就会重发; 并且有拥塞控制机制, 防止因为发送速率过快导致中间路由超载(buffer 用完)导致的大量丢包, 让速度维持在一个可靠的位置.
但是 TCP 的可靠是有代价的, 首先它需要建立连接, 而 UDP 直接发包就行. TCP 监测到自己发送的包丢失之后, 会暂时停止/减慢后面的数据包的发送, 主要会先把漏掉的包补上. 而监测到对面过来的数据包丢失的一边, 这个丢失数据包后面的包则无法交付给用户, 所以就会造成一个瞬间的大延时. 也就是电脑所谓的 TCP 的实时性差. 借助 TCP 的语音/直播应用, 就需要加入比较的缓冲空间, 避免这些延迟造成的中断. 换句话说就是用一个固定的延迟中和掉了随机产生的大延迟, 让人感觉连接没有中断. 而 UDP 虽然实时性好, 但是就 UDP 协议栈本身没法抵抗丢包, 除非应用有一套类似的 ARQ 机制, 或者 UDP 发送的内容里面包含了冗余编码, 从而在个别包丢失的情况下, 其他抵达的包仍然能还原内容. 特别是音频/视频应用里面这种技术非常的有用. 换句话说丢包对于这些有冗余设计的应用来说只是短暂降低了传输的质量, 但是并不会造成业务的中断.
有了 TCP 我们就可以建立连接. 但是连接之上我们需要一套协议, 用户规范连接里面的「礼仪」, 也就是各种各样的协议, 其中使用最广泛的代表就是 HTTP 协议. HTTP 不仅仅是用来传输文本, 比如网页, 还包含了 RPC 的基本设计理念, 比如 RESTful, 就好比你用 HTTP 传输你点个外卖的信息, POST 方法就是发出点外卖的请求, PUT 方法就是改变外卖订单信息, GET 方法就是获取订单状态, DELETE 方法就是撤销订单. 同样类比, 你查看这个回答就是 GET, 提交评论是 POST, 修改提交的评论是 PUT, 删除评论是 DELETE. 这样一套标准就能很方便实现各种功能.
但是问题在于这套协议构建在明文的 TCP 之上, 所以我们就需要 TLS/SSL 加密保护我们的 TCP 连接. 被 TLS/SSL 保护的 HTTP 也被叫做 HTTPS. 而加密之外还要进行身份验证(使用非对称密钥), 不能连上假的知乎, 那么就需要 PKI 机制去验证这个知乎的真伪. 然后验明正身的同时还需要协商出一把公共密钥(使用非对称密钥或者 DH 算法生成公共秘密)和对称加密算法(加解密是同一把密钥), 用于加密双方通信.
电脑DigiCert 签发的知乎域名证书
这里展示了加密了 TLS 的版本, 密钥协商算法 ECDHE_RSA, 非对称椭圆曲线算法 X25519 用于身份验证, AES-128-GCM 用于对称密钥加密传输, 其中还有一个消息摘要/哈希算法没有展示, 目前安全的算法通常是 SHA256, 还有 SHA3, 以及国密 SM3 干的也是这个事情
然后我们又回到最初的那段话了, 如果我们的 HTTP 返回的是 204(注意那个页面就是为了返回 204), 说明你大概率连上了互联网, 只不过身份确认无法做. 而还有个情况就是中间有人通过 DNS/路由/HTTP 劫持等手段掌握了你的 HTTP 连接(HTTPS + HSTS 做不到), 那么他就能发出 301 请求, 把你定位到另外一个页面, 这种技术通常叫做 portal, 也就是常见让你在付费的免费 Wi-Fi 下, 系统弹出一个页面让你登陆/付费.
电脑