《TCP/IP详解卷一》读书笔记
原文链接 http://www.rogerblog.cn/2016/04/11/tcp-ip/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
《TCP/IP详解卷一》读书笔记
第一章 概述
1.2 分层
TCP/IP 通常被认为是一个四层协议系统:
- 链路层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡
- 网络层,包括 IP 协议 , ICMP 协议 , IGMP 协议
- 运输层,包括 TCP , UDP . TCP 为两台主机提供高可靠性的数据通信,包含把应用层交给她的数据分成合适的小块交给网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。 UDP 则为应用层提供非常简单的服务,他只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能达到另一端。
- 应用层负责处理特定的应用程序细节。基本都包含以下应用:
- Telnet 远程登录
- FTP 文件数据传输
- SMTP 简单邮件传送协议
- SNMP 简单网络管理协议
网络层和运输层志坚的区别:网络层提供点到点的服务,运输层提供端到端的服务。
1.3 TCP/IP的分层
TCP 和 UDP 是两种运输层协议,二者都使用IP作为网络层协议。
ICMP是 IP 协议的附属协议。IP 层主要用它来与其他服务器或主机交换错误报文和其他重要信息。
IGMP 是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。
ARP 和 RARP 是某些网络的接口使用的特殊协议,用来转换IP层和网络接口层使用的地址。
1.5 域名系统
域名系统(nds)是一个分部的数据库,由它来提供IP地址和主机名之间的映射信息
第二章 链路层
链路层主要有三个目的:
- 为IP模块发送和接受IP数据报
- 为ARP模块发送ARP请求和接受ARP应答
- 为RARP发送RARP请求和接受RARP应答
ARP叫做地址解析协议,是用IP地址换MAC地址的一种协议,而RARP则叫做逆地址解析协议。
第三章 IP:网际协议
IP协议
IP是TCP/IP协议族中最为核心的协议。所有的TCP/UDP/ICMP及IGMP数据都以IP数据报格式传输。要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制--这被认为是上层协议--TCP或UDP要做的事情。
1.1 IP协议头
TTL:这个字段规定该数据包在穿过多少个路由之后才会被抛弃(这里就体现出来IP协议包的不可靠性,它不保证数据被送达),某个ip数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃。这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一样,一般是32或者是64,Tracerouter这个工具就是用这个原理工作的,tranceroute的-m选项要求最大值是255,也就是因为这个TTL在IP协议里面只有8bit。
1.2 IP路由选择
如果目的主机在直接相连的网络上,那么就把数据报直接传给目的主机,否则传给默认路由器。
稍微一般一点的情况是,主机通过若干个路由器(router)和目的主机连接。那么路由器就要通过ip包的信息来为ip包寻找到一个合适的目标来进行传递,比如合适的主机,或者合适的路由。路由器或者主机将会用如下的方式来处理某一个IP数据包
- 如果IP数据包的TTL(生命周期)以到,则该IP数据包就被抛弃。
- 搜索路由表,优先搜索匹配主机,如果能找到和IP地址完全一致的目标主机,则将该包发向目标主机
- 搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要“子网掩码(1.3.)”的协助。如果找到路由器,则将该包发向路由器。
- 搜索路由表,如果匹配同子网路由器失败,则匹配同网号(第一章有讲解)路由器,如果找到路由器,则将该包发向路由器。
- 搜索陆游表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包
- 如果都失败了,就丢掉这个包。
这再一次证明了,ip包是不可靠的。因为它不保证送达。
1.3 子网寻址
1.3.1 子网寻址
现在所有的主机都要求支持子网编址(RFC 950 [Mogul and Postel 1985])。不是把I P地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。 这样做的原因是因为A类和B类地址为主机号分配了太多的空间,可分别容纳的主机数为224-2和216-2。事实上,在一个网络中人们并不安排这么多的主机。由于全0或全1的主机号都是无效的(有其他用途),因此我们把总数减去 2。 在I n t e r N I C获得某类I P网络号后,就由当地的系统管理员来进行分配,由他(或她)来决定是否建立子网,以及分配多少比特给子网号和主机号。例如,这里有一个 B类网络地址(1 4 0 . 2 5 2) ,在剩下的16 bit中,8 bit用于子网号,8 bit用于主机号,格式如图所示。这样就允许有2 5 4个子网,每个子网可以有2 5 4台主机。
1.3.2 子网掩码
1.子网掩码的概念
子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。
2.确定子网掩码数
用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。
定义子网掩码的步骤为:
A、确定哪些组地址归我们使用。比如我们申请到的网络号为 “210.73.a.b”,该网络地址为c类IP地址,网络标识为“210.73”,主机标识为“a.b”。
B、根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们现在需要12个子网,将来可能需要16个(24)。用第三个字节的前四位确定子网掩码。前四位都置为“1”,即第三个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。
C、把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0”,则子网掩码的间断二进制形式为:“11111111.11111111.11110000.00000000”
D、把这个数转化为间断十进制形式为:“255.255.240.0”
这个数为该网络的子网掩码。
默认分配的子网掩码每段只有255或0
A类的默认子网掩码 255.0.0.0 一个子网最多可以容纳1677万多台电脑
B类的默认子网掩码 255.255.0.0 一个子网最多可以容纳6万台电脑
C类的默认子网掩码 255.255.255.0 一个子网最多可以容纳254台电脑
要想在同一网段,只要网络标识相同就可以了,那要怎么看网络标识呢?首先要做的是把每段的IP转换为二进制。(有人说,我不会转换耶,没关系,我们用Windows自带计算器就行。打开计算器,点查看>科学型,输入十进制的数字,再点一下“二进制”这个单选点,就可以切换至二进制了。)
把子网掩码切换至二进制,我们会发现,所有的子网掩码是由一串连续的1和一串连续的0组成的(一共4段,每段8位,一共32位数)。
255.0.0.0 11111111.00000000.00000000.00000000
255.255.0.0 11111111.11111111.00000000.00000000
255.255.255.0 11111111.11111111.11111111.00000000
这是A/B/C三类默认子网掩码的二进制形式,其实,还有好多种子网掩码,只要是一串连续的1和一串连续的0就可以了(每段都是8位)。如 11111111.11111111.11111000.00000000,这也是一段合法的子网掩码。子网掩码决定的是一个子网的计算机数目,计算机公式是2的m次方,其中,我们可以把m看到是后面的多少颗0。如255.255.255.0转换成二进制,那就是 11111111.11111111.11111111.00000000,后面有8颗0,那m就是8,255.255.255.0这个子网掩码可以容纳 2的8次方(台)电脑,也就是256台,但是有两个IP是不能用的,那就是最后一段不能为0和255,减去这两台,就是254台。我们再来做一个。
255.255.248.0这个子网掩码可以最多容纳多少台电脑?
计算方法: 把将其转换为二进制的四段数字(每段要是8位,如果是0,可以写成8个0,也就是00000000) 11111111.1111111.11111000.00000000 然后,数数后面有几颗0,一共是有11颗,那就是2的11次方,等于2048,这个子网掩码最多可以容纳2048台电脑。
一个子网最多可以容纳多少台电脑你会算了吧,下面我们来个逆向算法的题。
一个公司有530台电脑,组成一个对等局域网,子网掩码设多少最合适?
首先,无疑,530台电脑用B类IP最合适(A类不用说了,太多,C类又不够,肯定是B类),但是B类默认的子网掩码是255.255.0.0,可以容纳6万台电脑,显然不太合适,那子网掩码设多少合适呢?我们先来列个公式。
2的m次方=560
首先,我们确定2一定是大于8次方的,因为我们知道2的8次方是256,也就是C类IP的最大容纳电脑的数目,我们从9次方一个一个试2的9次方是 512,不到560,2的10次方是1024,看来2的10次方最合适了。子网掩码一共由32位组成,已确定后面10位是0了,那前面的22位就是1,最合适的子网掩码就是:11111111.11111111.11111100.00000000,转换成10进制,那就是255.255.252.0。
分配和计算子网掩码你会了吧,下面,我们来看看IP地址的网段。
相信好多人都和偶一样,认为IP只要前三段相同,就是在同一网段了,其实,不是这样的,同样,我样把IP的每一段转换为一个二进制数,这里就拿IP:192.168.0.1,子网掩码:255.255.255.0做实验吧。
192.168.0.1
11000000.10101000.00000000.00000001
(这里说明一下,和子网掩码一样,每段8位,不足8位的,前面加0补齐。)
IP 11000000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
在这里,向大家说一下到底怎么样才算同一网段。
要想在同一网段,必需做到网络标识相同,那网络标识怎么算呢?各类IP的网络标识算法都是不一样的。A类的,只算第一段。B类,只算第一、二段。C类,算第一、二、三段。
算法只要把IP和子网掩码的每位数AND就可以了。
AND方法:0和1=0 0和0=0 1和1=1
如:And 192.168.0.1,255.255.255.0,先转换为二进制,然后AND每一位
IP 11000000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
得出AND结果 11000000.10101000.00000000.00000000
转换为十进制192.168.0.0,这就是网络标识, 再将子网掩码反取,也就是00000000.00000000.00000000.11111111,与IP AND 得出结果00000000.00000000.00000000.00000001,转换为10进制,即0.0.0.1, 这0.0.0.1就是主机标识。要想在同一网段,必需做到网络标识一样。
我们再来看看这个改变默认子网掩码的B类IP 如IP:188.188.0.111,188.188.5.222,子网掩码都设为255.255.254.0,在同一网段吗? 先将这些转换成二进制
188.188.0.111 10111100.10111100.00000000.01101111
188.188.5.222 10111100.10111100.00000101.11011010
255.255.254.0 11111111.11111111.11111110.00000000
分别AND,得
10111100.10111100.00000000.00000000
10111100.10111100.00000100.00000000
网络标识不一样,即不在同一网段。
第四章 ARP:地址解析协议
ARP,即地址解析协议,实现通过IP地址得知其物理地址。在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。这样就存在把IP地址变换成物理地址的地址转换问题。以以太网环境为例,为了正确地向目的主机传送报文,必须把目的主机的32位IP地址转换成为48位以太网的地址。这就需要在互连层有一组服务将IP地址转换为相应物理地址,这组协议就是ARP协议。
第五章 RARP:逆地址解析协议
(来源于网络)
反向地址转换协议(RARP:Reverse Address Resolution Protocol) 反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。
RARP工作原理:
将源设备和目标设备的MAC地址字段都设为发送者的MAC地址和IP地址,发送主机发送一个本地的RARP广播,能够到达网络上的所有设备,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;如果不存在,RARP服务器对此不做任何的响应;
源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败
ARP和RARP是一对协议,比较一下吧,不比较还真不好总结
ARP广播后,只会有一个主机进行回应,就是携带某个IP的物理地址回应;而RARP由于有很多RARP服务器保存的有请求主机的IP和物理地址对应信息,所以只要保存有这个信息的主机都会回应
ARP请求物理地址,即广播后想要得到的是物理地址;RARP请求的是IP地址,即广播后想要得到的是IP地址;
ARP解析直接是内核实现,RARP的解析主要是读写存放IP和物理地址映射的磁盘文件;
由于每个主机的TCP/IP都实现了ARP解析,也包含了本身的物理地址和IP地址,所以当收到ARP请求包,就知道是否要回送信息;
而RARP不同,为了给无盘主机进行系统引导,所以必须要有实现了RARP服务器的主机进行解析;在一般的主机TCP/IP实现中并没有实现RARP服务器,由于其本省的复杂性,而且又和链路层的广播有关,所以实现也不好,不实现也不好,最后由于内核一般不对磁盘文件进行读写,所以就没有实现咯。
ARP在以太网帧中的协议类型为0x0806,RARP在以太网帧中的协议类型为0x8035;
第六章 ICMP:Internet 控制报文协议
参考 http://www.cnblogs.com/newwy/p/3224306.html 内容详尽
第七章 Ping 程序
参考 http://blog.csdn.net/peng_weida/article/details/7843504 内容详尽
未完待续...