1、1TCP/IP 详解学习笔记(1)- 基本概念为什么会有 TCP/IP 协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱 了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。 于是人们就想方设法的用电线把电脑连接到了一起。但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP/IP 就是为此而生。 TCP/IP 不是一个协议,而是一个
2、协议族的统称。里面包括了 IP 协议, IMCP 协议,TCP 协议,以及我们更加熟悉的 http、ftp、 pop3协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。TCP/IP 协议分层提到协议分层,我们很容易联想到 ISO-OSI 的七层协议经典架构,但是 TCP/IP 协议族的结构则稍有不同。如图所示TCP/IP 协议族按照层次由上到下,层层包装。最上面的就是应用层了,这里面有 http,ftp, 等等我们熟悉的协议。而第二层则是传输层,著名 的 TCP 和 UDP 协议就在这个层次(不要告诉我你没用过 udp 玩星际) 。第三层是网络层,IP 协议
3、就在这里,它负责对数据加上 IP 地址和其他的数据(后面 会讲到)以确定传输的目标。第四层是叫数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行 CRC 编码,为最后的数据传输做准备。再往下则是 硬件层次了,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等(这些我们就不用关心了,我们也不做网卡) ,所以有些书并不把这个层次放在 tcp/ip 协议族里面,因为它几乎和 tcp/ip 协2议的编写者没有任何的关系。发送协议的主机从上自下将数据按照协议封装,而接收数据的主机则按照协议 从得到的数据包解开,最后拿到需要的数据。这种结构非常有栈的味道,所以某些文章也把 tcp/i
4、p 协议族称为 tcp/ip协议栈。一些基本的常识在学习协议之前,我们应该具备一些基本知识。互联网地址(ip 地址)网 络上每一个节点都必须有一个独立的 Internet 地址(也叫做 IP 地址) 。现在,通常使用的 IP 地址是一个32bit 的数字,也就是我们常说的 IPv4 标准,这32bit 的数字分成四组,也就是常见的255.255.255.255的样式。IPv4标准上,地址被分为五类,我们常用的是 B 类地址。具体的 分类请参考其他文档。需要注意的是 IP 地址是网络号+ 主机号的组合,这非常重要。域名系统域名系统是一个分布的数据库,它提供将主机名(就是网址啦)转换成 IP 地址
5、的服务。RFCRFC 是什么?RFC 就是 tcp/ip 协议的标准文档,在这里我们可以看到 RFC 那长长的定义列表,现在它一共有4000多个协议的定义,当然,我们所要学习的,也就是那么十几个协议而已。端口号(port)注意,这个号码是用在 TCP, UDP 上的一个逻辑号码,并不是一个硬件端口,我们平时说把某某端口封掉了,也只是在 IP 层次把带有这个号码的 IP 包给过滤掉了而已。应用编程接口现在常用的编程接口有 socket 和 TLI。而前面的有时候也叫做 “Berkeley socket”,可见 Berkeley 对于网络的发展有多大的贡献。TCP/IP 详解学习笔记(2)-数据链
6、路层数据链路层有三个目的: 为 IP 模块发送和 接收 IP 数据报。 为 ARP 模块发送 ARP 请求和接收 ARP 应答。 为 RARP 发送 RARP 请 求和接收 RARP 应答ip 大家都听说过。至于 ARP 和 RARP,ARP 叫做地址解析协议,是用 IP 地址换 MAC 地址的一种协议,而RARP 则叫做逆地址解析协议,在 tcp/ip 协议的后面章节会介绍它们(在局域网里面用 ARP 协议可以很容易的搞瘫痪网络哦)数据链路层的协议还是很多的,有我们最常用的以太网(就是平时我们用的网卡)协议,也有不太常见的令3牌环,还有 FDDI,当然,还有国内现在相当普及的 PPP 协议(
7、就是 adsl 宽带) ,以及一个 loopback 协议。联系 linux 里面的 ifconfig -a 命令,这个命令通常会得到如下的结果eth0 Link encap:Ethernet HWaddr 00:01:4A:03:5B:EDinet addr:192.168.11.2 Bcast:192.168.11.255 Mask:255.255.255.0inet6 addr: fe80:201:4aff:fe03:5bed/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:2819 erro
8、rs:0 dropped:0 overruns:0 frame:0TX packets:76 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:241609 (235.9 KiB) TX bytes:9596 (9.3 KiB)lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: :1/128 Scope:HostUP LOOPBACK RUNNING MTU:16436 Metric:1RX pac
9、kets:2713 errors:0 dropped:0 overruns:0 frame:0TX packets:2713 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:3516032 (3.3 MiB) TX bytes:3516032 (3.3 MiB)其中,eth0就是以太网接口,而 lo 则是 loopback 接口。这也说明这个主机在网络链路层上至少支持loopback 协议和以太网协议。以太网(Ether-net)的定是指数字设备公司( Digital Equipment Corp
10、.) 、英特尔公司(Intel Corp.)和Xerox 公司在1982年联合公布的一个标准,这个标准里面使用了一种称作 CSMA/CD 的接入方法。而 IEEE802提供的标准集 802.3(还有一部分定义到了802.2中)也提供了一个 CSMA/CD 的标准。这两个标准稍有不同,TCP/IP协议对这种情况的处理方式如下: 以太网的 IP 数据报封装在 RFC894中定义,而 IEEE802网络的 IP 数据报封装在 RFC1042中定义。 一台主机一定要能发送和接收 RFC894定义的数据报。 一台主机可以接收 RFC894和 RFC1042的封装格式的混合数据报。 一台主机也许能够发送
11、RFC1042数据报。 。如果主机能同时发送两种类型的分组数 据,那么发送的分组必须是可以设置的,而且默认条件下必须是 RFC 894分组。可见,RFC1042 在 TCP/IP 里面处于一个配角的地位。这两种不同的数据报格式请参考教材。ppp(点对点协议)是从 SLIP 的替代品。他们都提供了一种低速接入的解决方案。而每一种数据链路层协议,都有一个 MTU(最大传输单元)定义, 在这个定义下面,如果 IP 数据报过大,则要进行分片(fragmentation),使得每片都小于 MTU,注意 PPP 的 MTU 并不是一个物理定义,而是 指一个逻辑定义(个人认为就是用程序控制) 。可以用 ne
12、tstat 来打印出 MTU 的结果,比如键入 netstat -inKernel Interface tableIface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flgeth0 1500 0 1774 0 0 0 587 0 0 0 BMRUlo 16436 0 2667 0 0 0 2667 0 0 0 LRU就可以观察到 eth0的 MTU 是 1500。而 lo(环回接口)的 MTU 则是16436。最后说说那个环回接口(loopback) 。平时我们用127.0.0.1来尝试自己的机器服务器好使不好
13、使。走的就是这个4loopback 接口。对于环回接口,有如下三点值得注意: 传给环回地址(一般是127.0.0.1)的任何数据均作为 I P 输入。 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是 因为广播传送和多播传送的定义包含主机本身。 任何传给该主机 IP 地址的数据均送到环回接口。这一章还是很简单的,一般作为了解知识也就足够了,没必要抠的那么详细。TCP/IP 详解学习笔记(3)-IP 协议,ARP 协议,RARP 协议把这三个协议放到一起学习是因为这三个协议处于同一层,ARP 协议用来找到目标主机的 Ethernet 网卡Mac 地址,IP 则承载要发送
14、的消息。数据链路层可以从 ARP 得到数据的传送信息,而从 IP 得到要传输的数据信息。1. IP 协议IP 协议是 TCP/IP 协议的核心,所有的 TCP,UDP,IMCP,IGCP 的数据都以 IP 数据格式传输。要注意的是,IP 不是可靠的协议,这是 说, IP 协议没有提供一种数据未传达以后的处理机制这被认为是上层协议 TCP或 UDP 要做的事情。所以这也就出现了 TCP 是一个可靠的协议,而 UDP 就没有那么可靠的区别。这是后话,暂且不提1.1. IP 协议头如图所示挨个解释它是教科书的活计,我感兴趣的只是那八位的 TTL 字段,还记得这个字段是做什么的么?这个字段规定该数据包
15、在穿过多少个路由之后才会被抛弃 (这里就体现出来 IP 协议包的不可靠性,它不保证数据被送达) ,某个 ip 数据包每穿过一个路由器,该数据包的 TTL 数值就会减少1 ,当该数据包的 TTL 成 为零,它就会被自动抛弃。这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一 样,一般是 32或者是64 ,Tracerouter 这个工具就是用这个原理工作的,tranceroute 的-m 选项要求最大值是255,也就是因为这个 TTL 在 IP 协议里面只有8bit。现在的 ip 版本号是4,所以也称作 IPv4。现在还有 I
16、Pv6,而且运用也越来越广泛了。51.2. IP 路由选择当一个 IP 数据包准备好了的时候,IP 数据包(或者说是路由器)是如何将数据包送到目的地的呢?它是怎么选择一个合适的路径来“送货“的呢?最特殊的情况是目的主机和主机直连,那么主机根本不用寻找路由,直接把数据传递过去就可以了。至于是怎么直接传递的,这就要靠 ARP 协议了,后面会讲到。稍微一般一点的情况是,主机通过若干个路由器(router)和目的主机连接。那么路由器就要通过 ip 包的信息来为 ip 包寻找到一个合适的目标来进行传递,比如合适的主机,或者合适的路由。路由器或者主机将会用如下的方式来处理某一个 IP 数据包 如果 IP
17、数据包的 TTL(生命周期)以到,则该 IP 数据包就被抛弃。 搜索路由表,优先搜索匹配主机,如果能找到和 IP 地址完全一致的目标主机,则将该包发向目标主机 搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要“子网掩码(1.3.)” 的协助。如果找到路由器,则将该包发向路由器。 搜索路由表,如果匹配同子网路由器失败,则匹配同网号(第一章有讲解)路由器,如果找到路由器,则将该包发向路由器。 搜索陆游表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包 如果都失败了,就丢掉这个包。这再一次证明了,ip 包是不可靠的。因为它不保证送达。1.3. 子网寻址IP 地址的定义是网络号+
18、 主机号。但是现在所有的主机都要求子网编址,也就是说,把主机号在细分成子网号+主机号。最终一个 IP 地址就成为 网络号码+ 子网号 +主机号。例如一个 B 类地址:210.30.109.134。一般情况下,这个 IP 地址的红色部分就是网络号,而蓝色部分就是子网号,绿色部分就是主机号。至于有多少位代表子网号这个问题上,这没有一个硬性的规定,取而代之的则是子网掩码, 校园网相信大多数人都用过,在校园网的设定里面有一个255.255.255.0的东西,这就是子网掩码。子网掩码是由32bit 的二进制数字序列,形式 为是一连串的1 和一连串的0 ,例如:255.255.255.0( 二进制就是11
19、111111.11111111.11111111.00000000) 对于刚才的那个 B 类地址,因为210.30是网络号,那么后面的109.134就是子网号和主机号的组合,又因为子网掩码只有后八 bit 为 0,所以主机号 就是 IP 地址的后八个 bit,就是134 ,而剩下的就是子网号码109。2. ARP 协议还记得数据链路层的以太网的协议中,每一个数据包都有一个 MAC 地址头么?我们知道每一块以太网卡都有一个 MAC 地址,这个地址是唯一的,那么 IP 包是如何知道这个 MAC 地址的?这就是 ARP 协议的工作。ARP(地址解析)协议是一种解析协议,本来主机是完全不知道这个 IP
20、 对应的是哪个主机的哪个接口,当主机要发送一个 IP 包的时候,会首先查一下自 己的 ARP 高速缓存(就是一个 IP-MAC 地址对应表缓存) ,如果查询的 IPMAC 值对不存在,那么主机就向网络发送一个 ARP 协议广播包,这个广播包 里面就有待查询的 IP 地址,而直接收到这份广播的包的所有主机都会查询自己的 IP 地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包 含自己的 MAC 地址的 ARP 包传送给发送 ARP 广播的主机,而广播主机拿到 ARP 包后会更新自己的 ARP 缓存(就是存放 IP-MAC 对应表的地方) 。发送 广播的主机就会用新的 ARP 缓
21、存数据准备好数据链路层的的数据包发送工作。6一个典型的 arp 缓存信息如下,在任意一个系统里面用“ arp -a”命令:Interface: 192.168.11.3 - 0x2Internet Address Physical Address Type192.168.11.1 00-0d-0b-43-a0-2f dynamic192.168.11.2 00-01-4a-03-5b-ea dynamic 都会得到这样的结果。 这样的高速缓存是有时限的,一般是20分钟(伯克利系统的衍生系统) 。3.RARP 协议(略)TCP/IP 详解学习笔记(4)-ICMP 协议,ping 和 Tracer
22、oute1. IMCP 协议介绍前面讲到了,IP 协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是 ICMP(网络控制报文) 协议。当传送 IP 数据包发生错误比如主机不可达,路由不可达等等,ICMP 协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在 IP 层以上的协议是可能做到安全的原因。ICMP 数据包由8bit 的错误类型和 8bit 的代码和16bit 的校验和组成。而前 16bit 就组成了 ICMP 所要传递的信息。书上的图6 3清楚的给出了错误类型和代码的组合代
23、表的意思。尽管在大多数情况下,错误的包传送应该给出 ICMP 报文,但是在特殊情况下,是不产生 ICMP 错误报文的。如下: ICMP 差错报文不会产生 ICMP 差错报文(出 IMCP 查询报文) (防止 IMCP 的无限产生和传送) 目的地址是广播地址或多播地址的 IP 数据报。 作为链路层广播的数据报。 不是 IP 分片的第一片。 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。虽然里面的一些规定现在还不是很明白,但是所有的这一切规定,都是为了防止产生 ICMP 报文的无限传播而定义的。ICMP 协议大致分为两类,一种是查询报文,一种是差错报文。
24、其中查询报文有以下几种用途: ping 查询(不要告诉我你不知道 ping 程序) 子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码) 时间戳查询(可以用来同步时间)而差错报文则产生在数据传送发生错误的时候。就不赘述了。2. ICMP 的应用-pingping 可以说是 ICMP 的最著名的应用,当我们某一个网站上不去的时候。通常会 ping 一下这个网站。ping会回显出一些有用的信息。一般的信息如下:7Reply from 10.4.24.1: bytes=32 time30000(真变态) 的 UDP 报,所以到达目的主机的时候,目的 主机只能发送一个端口不可达的 ICMP
25、数据报给主机。主机接到这个报告以后就知道,主机到了,所以,说 Traceroute 是一个骗子一点也不为过:)Traceroute 程序里面提供了一些很有用的选项,甚至包含了 IP 选路的选项,请察看 man 文档来了解这些,这里就不赘述了。TCP/IP 详解学习笔记(5)-IP 选路,动态选路,和一些细节81. 静态 IP 选路1.1. 一个简单的路由表选路是 IP 层最重要的一个功能之一。前面的部分已经简单的讲过路由器是通过何种规则来根据 IP 数据包的IP 地址来选择路由。这里就不重复了。首先来看看一个简单的系统路由表。Destination Gateway Genmask Flags
26、Metric Ref Use Iface192.168.11.0 * 255.255.255.0 U 0 0 0 eth0169.254.0.0 * 255.255.0.0 U 0 0 0 eth0default 192.168.11.1 0.0.0.0 UG 0 0 0 eth0对于一个给定的路由器,可以打印出五种不同的 flag。 U 表明该路由可用。 G 表明该路由是到一个网关。如果没有这个标志,说明和 Destination 是直连的,而相应的 Gateway 应该直接给出 Destination 的地址。 H 表明该路由是到一个主机,如果没有该标志,说明 Destination 是一
27、个网络,换句话说 Destination 就应该写成一个网络号和子网号的组合,而不包括主机号(主机号码处为 0),例如 192.168.11.0 D 表明该路由是为重定向报文创建的 M 该路由已经被重定向报文修改U 没啥可说的,G 说明这是一个网关,如果你要发数据给 Destination,IP 头应该写 Destination 的 IP 地址,而数据链路层的 MAC 地址就应该是 GateWay 的 Mac 地址了;反之,如果没有 G 标志,那么数据链路层和 IP层的地址应该是对应的。H 说明了 Destination 的 性质,如果是 H 的,则说明该地址是一个完整的地址,既有网络号又有主
28、机号,那么再匹配的时候就既要匹配网络号,又要匹配主机号;反 之,Destination 就代表一个网络,在匹配的时候只要匹配一下网络号就可以了。这样,IP 选路的方式就可以更加具体化了。如下 首先用 IP 地址来匹配那些带 H 标志的 DestinationIP 地址。 如果1失败就匹配那些网络地址。 如果2失败就发送到 Default 网关顺便提一下那个 GenMask(还记得子网掩码么) ,它指定了目的地址的子网号,例如第一条的子网就是11。1.2.其他有关路由表的知识一般,我们在配置好一个网络接口的时候,一个路由就被直接创建好了。当然我们也可以手动添加路由。用route add 命令就可
29、以了。而当一个 IP 包在某一个路由器的时候发现没有路由可走,那么该路由器就会给源主机发送“主机不可达”或者“网络不可达”的 ICMP 包来报错。注意,一般的操作系统默认是没有路由功能的,这需要自己配置。这些历史原因就不细说了,1.3.ICMP 的 IP 重定向报文和路由发现报文当 IP 包在某一个地方转向的时候,都回给发送 IP 报的源主机一个 ICMP 重定向报文,而源主机就可以利用这个信息来更新自己的路由表,这样,随着网络通信的逐渐增多,路由表也就越来越完备,数据转发的速度也会越9来越快。我们需要注意的是: 重定向报文只能由路由器发出。重定向报文为主机所用,而不是为路由器所用。在主机引导
30、的时候,一般会发送在网内广播一个路由请求的 ICMP 报文,而多个路由器则会回应一个路由通告报文。而且,路由其本身不定期的在网络内发 布路由通告报文,这样,根据这些报文,每一个主机都会有机会建立自己的路由表而实现网络通信。路由器在一份通告报文中可以通告多个地址,并且给出每一个地 址的优先等级,这个优先等级是该 IP 作为默认路由的等级,至于怎么算的就不深究了。路由器一般会在450-600秒的时间间隔内发布一次通告,而一个给定的通告报文的寿命是30分钟。而主机在引导的时候会每三秒发送一次请求报文,一旦接受到一个有效的通告报文,就停止发送请求报文。在 TCP/IP 详解编写的时候,只有 Solar
31、is2.x 支持这两种报文,大多数系统还不支持这两种报文。 (后面还会讲到一些有用的路由报文)动态选路协议前面的选路方法叫做静态选路,简要地说就是在配置接口的时候,以默认的方式生成路由表项。并通过route 来增加表项,或者通过 ICMP 报文来更新表项(通常在默认方式出错的情况下) 。 而如果上诉三种方法都不能满足,那么我们就使用动态选路。动态选路协议是用于动态选路的重要组成部分,但是他们只是使用在路由器之间,相邻路由器之间互相通信。系统(路有选择程序)选择比较合适的路有放到 核心路由表中,然后系统就可以根据这个核心路有表找到最合适的网路。也就是说,动态选路是在系统核心网络外部进行的,它只是
32、用一些选路的策略影响路由表, 而不会影响到最后通过路由表选择路由的那一部分。选路协议有一大类常用的叫做内部网关协议(IGP),而在 IGP 中,RIP 就是其中最重要的协议。一种新 的 IGP 协议叫做开放最短路经优先(OSPF) 协议,其意在取代 RIP。另一种最早用在网路骨干网上的 IGP 协议-HELLO,现在已经不用了。如今,任何支持动态选路的路由器都必须同时支持 OSPF 和 RIP,还可以选择性的支持其他的 IGP 协议。2.1.Unix 选路程序Unix 系统上面通常都有路由守护程序 routed。还有一个叫做 gate。gate 所支持的协议要比 routed 多,routed
33、 只是支持 RIPv1版本。而 gate 则支持 RIPv1、v2 ,BGPv1 等等。2.1.RIP:选路信息协议它的定义可以在 RFC1058内找到,这种协议使用 UDP 作为载体(也就是 UDP 的上层协议) 。我们最关心的就是 RIP 其中的一个段,叫做度量的 段,这是一个以 hop 作为计数器(就是以走过多少路由为计数器)的段(IP协议里面也有一个 TTL 不是么) 。这个度量段将最终影响到路由表的建立。参考图:10一般说来 routed 要承担如下的工作:给每一个已知的路由器发送 rip 请求报文,要求其他路由器给出完整的路由表。这种报文的命令字段为 1,地址字段为0,度量地段为1
34、6(相当于无穷大) 。接受请求,如果接收到刚才的那个请求,就把自己的完整的路由表交给请求者。如果没有,就处理 IP 请求表项,把表项中自己有的部分添上跳数,没有的部分添上16。然后发给请求者。接受回应。更新自己的路由表。使用 hop 数小的规则。定期更新路由表,一般是30s( 真频繁)给相邻的路有启发一次自己的路由表。这种形式可以使广播形式的。这个协议看起来会工作的很好,但是,这里面其实有很多隐藏的忧患,比如说 RIP 没有子网的概念,比如说环路的危险。而且 hop 数的上限也限制了网络的大小。因此,出现了很多 RIPv1的替代品,比如说 RIPv2,比如说 OSPF。他们都是通过某种策略来影
35、响路由表,所以就不说了。TCP/IP 详解学习笔记(6)-UDP 协议1.UDP 简要介绍UDP 是传输层协议,和 TCP 协议处于一个分层中,但是与 TCP 协议不同,UDP 协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。2.UDP 协议头2.1.UDP 端口号由于很多软件需要用到 UDP 协议,所以 UDP 协议必须通过某个标志用以区分不同的程序所需要的数据包。端口号的功能就在于此,例如某一个 UDP 程序 A 在系统中注册了3000端口,那么,以后从外面传进来的目的端口号为3000 的 UDP 包都会交给该程序。端口号理论上可以有216这么多。因为它的长 度是16个 bit2.2.UDP 检验和