# 写在前面 TCP/IP模型是计算机网络的事实标准,它在历史上出现得也比国际标准OSI模型要早.因为在日本大学院的专攻就是网络工学,再加上过去几年担当塾讲师,讲过多轮计算机网络的课,对各层的功能,主要协议和设备等都有一些基本的了解. # 阅读笔记 TCPIP详解一共有3卷,我手上有英文原版,也有中文翻译版,阅读以译本为参考,然后每卷单列一个子目录。 - 卷1-协议 - 卷2-实现 - 卷3-TCP事务协议,HTTP,NNTP和UNIX域协议 ## a1-概述
协议的定义: 国家事务或外交场合的正式程序或规则系统.
不同厂商,不同型号的计算机之间也需要进行数据交换,它们也需要一系列通用的协议来完成指定任务.所以就需要TCP/IP参考模型. ## a2-internet地址结构 ### 表示IP地址 大多数用户所熟悉的IP地址,是IPv4地址,一般采用点分十进制。 与之相对的,是在IPv6中,地址长度从32位扩展到128位,它使用的是8段四位十六进制数,每个字段由冒号: 分隔.并且它也有一些简化的书写方法. - 一个字段前导的0可以不写,比如5f05:2000:80ad:5800:0058:0800:2023:1d71可以写为5f05:2000:80ad:5800:58:800:2023:1d71 - 全零的字段可以省略,并用符号::代替,但为了避免歧义,只能使用一次::,比如0:0:0:0:0:0:0:1可以简写为::1.而2001:0db8:0:0:0:0:0:2可以简写为2001:db8::2. - 如果在IPv6中嵌入IPv4地址要, 可以混合点分十进制和十六进制的写法,比如::ffff:10.0.0.1表示IPv4地址10.0.0.1,即被**IPv4映射的IPv6地址**. - IPv6的低32位通常采用点分十进制写法,比如::0102:f001相当于地址::1.2.240.1,它被称为**IPv4兼容的IPv6地址**,但这种写法只用于IPv4和IPv6的过渡计划. ### 基本的IP地址结构 根据IPv4地址长度,可以计算它的地址空间大小为$2^{32}=4,294,967,296$,而IPv6的地址空间为$2^{128}=340,282,366,920,938,463,463,374,607,431,768,211,456$. 所以势必要进行地址分块,才能方便使用. #### 分类地址 为了在茫茫互联网世界中定位到某一台电脑,需要先找到它所在的网络,(因为互联网本身就是由类型不同,规模不同的网络组成的),所以IPv4地址也反映了这一要素,它分为**网络号**和**主机号**. #### 早期分类 早期将IPv4地址分为ABCDE这5类,列表如下: ^ 类别 ^ 网络号 ^ 主机号 ^ 特征 ^ 网络数 ^ 主机数 ^ | A | 8位 | 24位 | 网络号以0开头 | 128 | 16,777,216 | | B | 16位 | 16位 | 网络号以10开头 | 16384 | 65536 | | C | 24位 | 8位 | 网络号以110开头 | 2097152 | 256 | | D | | | 网络号以1110开头,用于组播 | NA | NA | | E | | | 网络号以1111开头,保留地址 | NA | NA | 补充说明: 有些地址通常不作为单播地址使用,比如地址块中的第一个和最后一个地址,前者用于表示该网络,后者表示网络广播地址. #### 子网寻址 但这种分类方法慢慢出现了新问题,A类和B类网络号规模太大,浪费了许多主机号(太多用不完),而C类规模较小,不能提供足够的主机号. 为了解决这一问题,在保持ABC类网络号集中分配的前提下,各站点的管理员获得权利进一步划分子网络号.但同时也带来了新问题,之前的ABCDE分类方法只要知道网络号,就知道主机号位数了,现在管理员是如何划分子网络的需要反映到路由器和主机中.即只有被划分子网的网络中的主机和路由器知道子网结构. {{:resources:books:pasted:20250118-134121.png}} 这里给出了一个示例,左右两个以太网都是子网络,按ABCDE分类法,它们属于B类网络号,即128.32.x.x. 外网的流量先经过边界路由器(这里路由器对外的IP地址为137.164.23.30),因为下面连着2个子网络,所以路由器要区分流向2个子网络的流量.它要找到子网ID. #### 子网掩码 子网掩码是一台主机或路由器所使用的分配位,为了确定子网ID.除了用二进制表示外,一般更常用的方式是/xx(范围是1~32) 上面的例子里,网络管理员选择的**子网掩码**是255.255.255.0,即/24.每个子网可以连接256-2=254台主机. 子网掩码中某位的1表示IP地址的对应位与一个地址的网络/子网络部分对应, 子网掩码中某位的0表示IP地址的对应位与一个地址的主机号部分对应. ## a3-链路层 ### 3.1 引言 链路层的目的是为IP模块发送和接收IP数据报(即PDU),在L2链路层可以携带一些IP辅助协议,比如ARP. TCP/IP支持多种不同的链路层,即该层所处的局域网,它于网络硬件类型有关,常见的有以下几种: * 有线局域网,如以太网(Ethernet) * 城域网(MAN),如ISP提供的有线电视和DSL连接 * 有线语音网络,比如支持调解解调器的电话线 * 无线网络,如Wi-Fi * 基于蜂窝技术的各种无线数据服务,比如HSPA,EV-DO,LTE和WiMAX(即电话运营商提供的) 这几种以第1,4和5种最为常见. 在L2层,我们使用帧(Frame)来与其他层的PDU进行区分.帧格式支持可变帧长度,范围是64Bytes到1518Bytes,上限称之为MTU(最大传输单元). 关于帧最小为64Bytes的解释,有兴趣可以点开看一下: ++++ 折叠部分 | 帧大小 最早的以太网是10Mb/s,为了能让发数据的站知道哪个帧发生了冲突,将一个以太网的最大长度限制在2500m (此时使用4个中继器Repeater连接5个500m的电缆段). 这里就需要加点物理知识了,电子在铜线中的传播速度约为0.77c(c表示光速,学过高中物理的同学应该都知道),则64Bytes采用10Mb/s线缆传输时,用时为 $64\times 8bit/ 10 \times 10^6 =51.2 \mu s$ 最小长度的帧能在电缆中传输约11000m $51.2 \times 10^{-6} \times 0.77\times 300000000 m/s=11000 m$ 如果电缆最大长度限定为2500m,则一次往返距离为5000m 一个输出帧的最位位(比特)在所需时间后仍处于传输过程中,这个时间是信号到达位于最大距离的接收器并返回的时间,如果这时检测到冲突,传输中的站能知道哪个帧发生冲突(即当前正在传输的帧),这里该站会发送一个干扰信号来提醒其他站,然后启动一个随机的二进制指数退避过程(Back-to-N) ++++ ### 3.2 IEEE802 LAN/MAN标准 以太网标准是1980年首次发布,并在1982年加以修订,第一个常见格式的以太网是10Mb/s以太网,被IEEE采纳被经过轻微修改成为802.3标准. 它的结构是,一个或多个站(即主机)组成的共享一个电缆段的区域.因为线路共享,为了减少冲突,采用了CSMA/CD机制,可以协调哪些计算机可以访问共享介质,不需要其他特殊协议或同步. CSMA/CD的处理流程如下: 待补充 ## a4-地址解析协议 ## a5-internet协议 ## a6-系统配置_dhcp和自动配置 ## a7-防火墙和网络地址转换 ## a8-icmpv4和icmpv6_internet控制报文协议 ## a9-广播和本地组播_igmp和mld ## a10-用户数据报协议和ip分片 ## a11-名称解析和域名系统 ## a12-tcp_传输控制协议_初步 ## a13-tcp连接管理 ## a14-tcp超时与重传 ## a15-tcp数据流与窗口管理 ## a16-tcp拥塞控制 ## a17-tcp保活机制 ## a18-安全_可扩展身份认证协议_ip安全协议_传输层安全_dns安全_域名密钥识别邮件 接下来是第2卷,内容是TCP/IP的具体实现,它有32章之多. ## b1-概述 ## b2-mbuff_存储器缓存 ## b3-接口层 ## b4-接口_以太网 ## b5-接口_SLIP和环回 ## b6-IP编址 ## b7-域和协议 ## b8-IP网际协议 ## b9-IP选项处理 ## b10-IP的分片与重装 ## b11-ICMP_Internet控制报文协议 ## b12-IP多播 ## b13-IGMP_Internet组管理协议 ## b14-IP多播选路 ## b15-插口层 ## b16-插口I/O ## b17-插口选项 ## b18-Radix树路由表 ## b19-选路请求和选路消息 ## b20-选路插口 ## b21-ARP_地址解析协议 ## b22-协议控制块 ## b23-UDP_用户数据报协议 ## b24-TCP_传输控制协议 ## b25-TCP的定时器 ## b26-TCP输出 ## b27-TCP的函数 ## b28-TCP的输入 ## b29-TCP的输入(续) ## b30-TCP的用户需求 ## b31-BPF_BD分组过滤程序 ## b32-原始IP