JohnLui:程序员,Swift Contributor,正在写《iOS 可视化编程与 Auto Layout》

软件工程师需要了解的网络知识:从铜线到HTTP(三)—— TCP/IP_java


那些首部


软件工程师需要了解的网络知识:从铜线到HTTP(三)—— TCP/IP_java_02

一个 HTTP 请求发送到服务器上,需要在头部按顺序加上 TCP首部、IP首部、以太网首部,这样才能保证这个 HTTP 请求的二进制数据能够在复杂的网络环境中得到可靠的传输:这三个首部在经过各种网络设备时会被大量修改以实现正确传输:以太网首部在经过交换机时并不会被修改,但是 IP首部 和 TCP首部 在经过路由器时会被修改。


TCP/IP 概述


当我们通过书本、博文等了解 TCP/IP 技术时,均将这两者作为两层来讲,似乎他们就是网络标准中的两个不同的虚拟化层级,但事实并没有这么简单。

我的虚拟化观

当初我学习《计算机组成原理》这本书的时候,我印象最深刻的就是里面对于计算机“虚拟化”的描述:只看计算机的硬件部分,其本质就是多层虚拟化:用逻辑电路、加法电路、积分电路、微分电路等模拟出算数逻辑单元、再和寄存器一起虚拟出运算器和控制器,配合由六个三极管组成一位的 SRAM 虚拟出的 L1、L2、L3 缓存,再配合由电容构成的 DRAM 虚拟出的“线性数组”内存,再由各种总线相互连接,实现了一个可以被操作系统软件控制的基础硬件平台。之后,这个基础硬件平台和操作系统一起虚拟出提供基本计算和逻辑判断服务的 CPU 以及可以被 C 指针读取的一个又一个内存存储单元。

计算机本身就是一层有一层虚拟化的产物,其复杂性远超我们日常生活中的复杂机械设备如汽车。计算机是一个纯粹的“人造”产物,是人类智能的集中体现。计算机从最底层的电路到最上层浏览器中显示出一个字,这背后正是虚拟化思想降低了复杂度,让人脑这个超低内存的计算机能够建造出如此纷繁复杂的计算机大厦。

TCP/IP 的关系

IP 技术是从 TCP 技术中拆分得来的,如此多层的虚拟化显然不是一开始就这么设计的,人脑是趋利避害的,不会随意提高复杂度。

TCP/IP 技术源于美国军方自 1969 年起开始建设的控制点分散的网络系统 ARPAnet。1975 年,ARPAnet 的规模达到一百多台计算机,只靠传统的硬件协议(如以太网协议)已经很难再支撑更大规模的网络了,于是开始研发 TCP/IP 技术,并在 1980-1983 年间完成了内部转换。1983 年,支持异构网络的完全架空的 TCP/IP 协议正式发布。此处的异构网络指的是 ARPAnet、以太网、令牌环网、光纤网络(如 FDDI 和现在常说的 FTTH)、PPP 网络(如电话拨号 PPPoE)等 OSI 1-2 层的网络。

就在 1983 年,TCP/IP 被 Unix 4.2 BSD 系统采用。随着 Unix 的成功,TCP/IP 逐步成为 Internet 的标准网络协议,兼容多种物理实现。

TCP/IP 和以太网

以太网诞生后,提供了一种简单的容易扩展的多台计算机相连接的电信号传输系统,能够一次性传输特定长度的 0、1 信息。以太网和 TCP/IP 是独立发展的,以太网是当前最成功的局域网技术,TCP/IP 则是整个 Internet 的标准协议:无论是局域网内常用的以太网,还是 FDDI 光纤网络,甚至是 LTE 4G 网络,都支持 TCP/IP 协议在其之上运行。从这个角度来看,TCP/IP 才是 Internet 的本体。

TCP/IP 协议簇是先有实现后有协议的,是从一个已经商用的成熟的网络架构中拆分出来的。


IP 首部


像以太网帧拥有首部一样,IP 报文也是用首部来描述属性信息的。

详解图

以下为 ip 首部详解图(IPv4):

软件工程师需要了解的网络知识:从铜线到HTTP(三)—— TCP/IP_java_03简单解释

上图中每一行表示 32 位二进制数据。拥有 ip 首部特征的数据会被交换机、路由器、电脑网卡等以太网设备当做有效的 IP 报文(也称“IP数据报”)。

重要数据描述

  1. 总长度:界定了本次 ip 报文的长度,便于读取有效数据

  2. 源地址:本次 ip 报文是由那个 ip 地址发出的

  3. 目的地址:本次 ip 报文需要发给哪一台设备

源地址和目的地址均为 32 位(4 个字节)。我们常见的一个 IPv4 地址为:192.168.1.1,IPv4 地址范围为 0.0.0.0 - 255.255.255.255,255 为 2 的 8 次方减一,也就是说用八位二进制可以表示 0-255,四个八位即为 32 位。

小 tip

1 字节等于八位,字节这个单位的出现是因为一个内存地址对应的数据长度为八位,是一个内存相关概念,在理解网络时我们最好抛弃这个概念,全部使用位。


结论


ip 层实际上就是规定了一个首部,里面最重要的数据是源 ip 地址和目的 ip 地址。


TCP 首部


软件工程师需要了解的网络知识:从铜线到HTTP(三)—— TCP/IP_java_04重要数据描述
  1. TCP 首部中最重要的数据是源端口和目的端口

  2. 他们各由 16 位二进制数组成,2^16 = 65536,即端口范围为 0-65535

  3. 我们可以需要注意到,目的端口号这个重要数据是放在 TCP 首部的,和 IP 首部、以太网帧首部毫无关系