A
TCP/IP 是什么?

本文大半内容都不对,弃了弃了~

自计算机和互联网出现,大多数计算机都被用于上网、发邮件或者只是通过网路使用一下网络共享打印机。计算机网络 ^1 可以连接各种功能不一样的电子设备,例如笔记本电脑、平板电脑、智能手机、服务器、打印机、扫描仪、路由器等设备。如果说以上设备连上网络后都算是 “传统” 节点,那在现在的物联网时代,各种计算机新品种就可以算作 “非传统” 节点了吧,毕竟现在能连网的设备真的是五花八门。再说征服王 “互联网” 现在真的可以说已经征服世界的情况下,计算机网络类型都可以分成 5 种:

  • PAN - 个人网络,一台电脑配打印机等设备
  • LAN - 局域网,一个路由器下的网络
  • WLAN - 无线局域网,一个无线路由器信号覆盖下的网络
  • MAN - 都市网,一个城市的网络
  • WAN - 广域网,一个省、国家或整个世界下的网络,比如互联网

在这么广阔的网络下,如果节点之间通讯只靠一个 “节点 ID” 作为坐标来互动,那互动时所传输的数据恐怕是要迷路很久甚至有可能累死在路上。TCP/IP^2 就包含了网络相关的标准规范。这个协议集合里的 IP 部分就很好的为迷路的数据指明了方向。

先来个更好的文章做参考:太厉害了,终于有人能把 TCP/IP 协议讲的明明白白了!TCP/UDP 常见端口参考

网络上两个节点之间通讯需要 3 样东西来指路:

  • 节点在网络上的地址(IP 地址)
  • 节点的名称(MAC 地址)
  • 节点里应用或服务接收数据的端口(Port 端口)

# TCP/IP 协议全家桶

全家桶包含 ARP, BGP, DHCP, DNS, FTP, HTTP, ICMP, IGMP, IP, TCP, Telnet, TFTP, UDP, WWW 等。 节点上的 TCP/IP 栈,需跟随所运行的网络应用的要求,从全家桶中选择合适的协议;不同的节点有可能会使用不一样的 TCP/IP 栈。

# 网络体系结构 OSI 七层模型

名称 功能 TCP/IP 协议族
7 应用层 (Applicaiton) 终端用户的接口支持:文件传输,电子邮件,文件服务,虚拟终端 TFTP, HTTP, SNMP, FTP, SMTP, DNS, Telnet
6 表示层 (Presentation) 数据格式化,代码转换,数据加密 N/A
5 会话层 (Session) 连接管理:解除或建立与别的节点的联系 N/A
4 传输层 (Transport) 端对端传输管理,提供端对端的接口 TCP, UDP
3 网络层 (Network) 端对端路由,为数据包选择路由 IP, ICMP, RIP, OSPF, BGP, IGMP
2 数据链路层 (Data Link) 网络接入和架构管理,传输有地址的帧以及错误检测功能 SLIP, CSLIP, PPP, ARP, RARP, MTU
1 物理层 (Physical) 比特流生成和接收,以二进制数据形式在物理媒体上传输数据 ISO2110, IEEE802, IEEE802.2

# IP 协议

IP 协议理论上让每个网络不管大小都有一个唯一的 IP 地址(或称作 “节点地址”),但事实上不是每个网络(小到一台电脑配一个打印机)都能独享世界唯一 IP 地址。讨论 “不能独享世界唯一 IP 地址的情况下,数据到底怎么就不会迷路了?” 的问题之前,我们要先认识 IP 地址的格式。

# IPv4 格式

IPv4 使用 32-bit 节点地址,分成 4 个 8-bit 部分,例如:

01110000.11011110.11100110.00001111

使用十进制的眼光来看这个节点地址就会变成这样:

112.222.230.15

每一个 8-bit 部分的最大值是 255。 一个 IP 地址包含有两组信息:网络 ID 和节点 ID。

网络 ID 分为 3 类:

  • A 类
    • IP 地址范围:1.0.0.0 ~ 126.255.255.255
    • A 类网络 ID 为第 1 个 8-bit 部分
    • 例子: 112.222.230.15 属于 A 类,网络 ID 为 112 ,节点 ID 为 222.230.15
  • B 类
    • IP 地址范围:128.0.0.0 ~ 191.255.255.255
    • B 类网络 ID 为第 1-2 个 8-bit 部分
    • 例子: 142.112.1.70 属于 B 类,网络 ID 为 142.112 ,节点 ID 为 1.70
  • C 类
    • IP 地址范围:192.0.0.0 ~ 223.255.255.255
    • C 类网络 ID 为第 1-3 个 8-bit 部分
    • 例子: 192.168.1.1 属于 C 类,网络 ID 为 192.168.1 ,节点 ID 为 1 其中以 127 开头的 IP 地址为 “回环地址”,数据信息的发送者发出的数据流会原样送回发送者。 网络 ID 越大,处于该网络下的主机或节点越少。一般家庭用的路由器网络 ID 为 192.168.1 的情况下最多只能连接 254 个设备。

# IPv6 格式

IPv6 使用 128-bit 节点地址,分成 8 个 4 位数的八进制 16-bit 部分,例如:

2001:0000:5723:0000:0000:D14E:DBCA:0764

也可以缩写成这样:

2001:0:5723::D14E:DBCA:764

其他例子:

2001:0DA8:0000:0000:0001:0000:0000:0001 => 2001:DA8::1:0:0:1 OR 2001:DA8:0:0:1::1 0:0:0:0:0:0:0:1 => ::1 0:0:0:0:0:0:0:0 => ::

开头 64-bit 包含了网络和子网络的地址,后面 64-bit 是接口 ID。因为 IPv6 地址是直接赋予接口的,所以一个主机可以有多个 IPv6 地址对应不同的网络连接。下图拆开开头 64-bit 网络地址: IPv6 Prefix

# 路由器

路由器是能连接多个网络的设备。它们决定了数据的去向,但它们一般都不是数据的最终接收者。数据在传输过程中有可能经过多个跳板 ^3,一般这些数据跳的次数过多且还没到目的地的话就会累死在路上,造成的结果就是发送者得不到回应、响应超时或者收到路由甲回应的死亡信息。

一个 ID 为 142.222 的网络例子: Network 142.222.x.x 在这个网络中,所有的主机或节点都是必须要向路由器 142.222.9.255 发送他们的数据,这样数据才可以在这个网络中畅行或者从这个网络发出到更外面的网络;所以在这里路由器 142.222.9.255 被称为是默认网关。

假如在以上网络中主机 142.222.12.27 要发送数据到服务器 112.111.72.56 ,数据会先到路由器 142.222.9.255 ,路由器会通过路由表查找数据的下个传送目标(随便一提,需要解析域名的情况下,找到一个 IP 记录丰富的 DNS 也能让你的数据少跳跳板,数据极低概率会累死在路上)。

假如在以上 B 类网络基础上存在子网络Network 142.222.x.x with subnet 在子网络中主机 142.222.10.2 要发送数据到服务器 142.123.32.14 ,数据会先到路由器 142.222.10.255 ,再到外面网络的路由器 142.222.255.255 ,再到更外面网络的路由器 142.255.255.255 ;找到 142.255.255.255 的下级 142.123.255.255 ,再到服务器 142.123.32.14 。当然,如果网络 142.123 底下也有子网络的话,就要通过网关 142.123.32.255 ,之后才是服务器 142.123.32.14

# MAC 地址

MAC 地址一般说的就是网卡生产出来自带的 12 个十六进制数的 ID,当然也可以通过软件生成一个随机的 MAC 地址,只要主机所在的网络路由器上的 ARP 表上没有就行。它能够在一个网络下确认主机发送者或接收者的身份。因为 MAC 地址都是厂家定的,对比 IP 地址,MAC 地址就可以有唯一标识了,甚至一人手上说不定还能独享多个 “唯一”。MAC 地址例子如下:

00-0B-DB-45-A4-CC

前 6 个数代表制造商: 00-0B-DB 后 6 个数为唯一编号: 45-A4-CC

# ARP 协议

ARP 协议让路由器记录下哪个 IP 地址对应哪个 MAC 地址。因为 IP 地址多数为动态,一个设备说不定某天就移民了,所以路由器一般都有一个 ARP 表记录和分配 IP 地址给底下的子民;要是有的子民刚移民过来没有记录在案,在有数据传送过来路由找不到人的情况下会发广播,以这样的操作令底下子民回应,之后强制记录在案。

更多可以百度 TCP/IP 全家桶各种协议,比较重要的还有数据包结构、DHCP [^4] 和 DNS [^5]。

[^4]: 为网关节点管理下的主机进行动态 IP 地址的分配;有效防止人工操作的失误;有主机被迁移或更替的情况下能够自动更新配置 [^5]: 域名服务器能够帮助解析域名到对应 IP 地址