TCP/IP详解学习笔记
【TCP/IP详解学习笔记(1)基本概念】
为什么会有TCP/IP协议?
计算机型号多种多样,并且运行于不同操作系统。虽然电线把计算机连接到了一起,但是这些计算机无法“交流”,所以需要定义一些东西来让这些计算机交流,TCP/IP因此而生。
TCP/IP协议分层
提到分层,我们很容易想到OSI的七层参考模型。TCP/IP协议族的层次有些不同。
应用层:
- Telnet远程登录
- FTP文件传输协议
- SMTP简单邮件传送协议
- SNMP简单网络管理协议
基本知识点
-
路由器与网桥
路由器的好处是为不同类型的物理网络提供连接:以太网、令牌环网、点对点的链接和FDDI(光纤分布式数据接口)。路由器是在网络层上对网络进行互联,网桥是在链路层上对网络进行互联
-
互联网地址
网络上的每个接口都必须有一个唯一的Internet地址(也称作IP地址),IP地址是网络号+主机号
-
域名系统
DNS是一个分布式数据库,提供IP地址和主机名之间的映射信息
-
端口号
这个号码是用在TCP,UDP上的一个逻辑号码,并不是一个硬件端口,我们平时说把某某端口封掉了,也只是在IP层次把带有这个号码的IP包给过滤掉了而已。
-
RFC
RFC是tcp/ip协议的标准文档
-
应用编程接口
现在常用的编程接口有socket和TLI。而前面的有时候也叫做“Berkeley socket”,可见Berkeley对于网络的发展有多大的贡献。
-
以太网
以太网不是一种具体网络,是一种技术规范。以太网是当今现有局域网采用的最通用的通信协议标准,该标准定义了在局域网中采用的电缆类型和信号处理方法。以太网络使用CSMA/CD(载波监听多路访问及冲突检测)技术,并以10M/S的速率运行在多种类型的电缆上。
-
TCP/IP中,网络层和运输层之间的区别是最为关键的:网络层(IP)提供点到点的服务,而运输层(TCP和UDP)提供端到端的服务
-
计算机互联构成计算机网络
-
计算机网络互连构成因特网
【TCP/IP详解学习笔记(2)链路层】
数据链路层三个目的:
- 为IP模块发送和接收IP数据报
- 为ARP模块发送ARP请求和接收ARP应答
- 为RARP发送RARP请求和接收RARP应答
以太网(Ether-net)是指数字设备公司( Digital Equipment Corp.)、英特尔公司(Intel Corp.)和Xerox公司在1982年联合公布的一个标准,这个标准里面使用了一种称作CSMA/CD的接入方法。而IEEE802提供的标准集802.3(还有一部分定义到了802.2中)也提供了一个CSMA/CD的标准。这两个标准稍有不同,TCP/IP协议对这种情况的处理方式如下:
-
以太网的IP数据报封装在RFC894中定义,而IEEE802网络的IP数据报封装在RFC1042中定义。
-
一台主机一定要能发送和接收RFC894定义的数据报。
-
一台主机可以接收RFC894和RFC1042的封装格式的混合数据报。
-
一台主机也许能够发送RFC1042数据报。。如果主机能同时发送两种类型的分组数 据,那么发送的分组必须是可以设置的,而且默认条件下必须是RFC 894分组。
可见,RFC1042在TCP/IP里面处于一个配角的地位。
- SLIP
是一种在串行线路上对IP数据报进行封装的简单形式,SLIP适用于家庭中每台计算机几乎都有的RS-232串行端口和告诉调制解调器介入Internet
- PPP
PPP(Point-to-Point Protocol)协议是在SLIP的基础上发展起来的,它是TCP/IP网络协议的一员,PPP是TCP/IP的扩展,它增加了两个额外的功能组:
(1)它可以通过串行接口传输TCP/IP包
(2)它可以安全登录
- 环回接口
loopback接口,在网络设备上是一种特殊的接口,它不是物理接口,而是一种看不见摸不着的逻辑接口(虚拟接口)
- 最大传输单元MTU
各类型的网络对数据帧的长度都有一个限制,链路层的这个特性称作MTU,即最大传输单元
- 路径MTU
两台通信主机中最小的MTU,被称作路径MTU
【TCP/IP详解学习笔记(3)IP协议,ARP协议、RARP协议】
这三个协议处于同一层
IP协议
IP : 不可靠 无连接
- 不可靠:不能保证IP数据报能成功到达目的地(错误处理方式:丢弃数据报,然后发送ICMP消息给信源端)
- 无连接:IP并不维护任何关于后续数据报的状态信息
看下图:
4位版本:IPV4
首部长度:单位是32位字,即4字节,首部长度占4位,可表示最大十进制是15,首部长度达到最大值60字节
TOS:3bit优先权子字段(已被忽略)+4bitTOS子字段+1bit未用位(必须置0)
4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用
总长度字段:整个IP数据报的长度,以字节位单位,该字段长16bit,所以IP数据报最长可达65535
TTL:time-to-live,某个数据报每穿过一个路由器,它的值就减1,当数据报的TTL称为零,它就被自动抛弃(说明了IP协议包的不可靠性)
选项:
(1)安全和处理限制
(2)记录路径(让每个路由器都记下它的IP地址)
(3)时间戳
(4)宽松的源站选路
(5)严格的源站选路
IP路由选择
主要完成以下功能:
(1)搜索路由表,先寻找与目的IP匹配的表目,若找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(根据路由表标志字段的值)
(2)搜索路由表,寻找与目的网络号匹配的条目,若找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(根据路由表标志字段的值)
(3)搜索路由表,寻找“默认”条目,若找到,把报文发送给该表目指定的下一站路由
如果都失败了,丢弃
ip路由选择通过逐跳来实现。数据报在各站传输过程中目的IP地址始终不变,但是封装和目的链路层地址在每一站都可以改变
子网寻址
IP地址定义是网络号+主机号。但是现在所有主机都要求子网编址,即把主机号再细分为子网号+主机号,最终一个IP地址就是网络号+子网号+主机号。
子网掩码
用于让主机知道有多少比特给了子网号,有多少比特给了主机号。值为1的比特留给网络号和子网号,为0的比特留给主机号。
两个重要的命令
获取接口和网络的信息
ARP协议
将IP地址转换成物理地址
假设A与B通信:
主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
第1步:根据A上的路由表内容,IP确定访问B的转发IP地址是192.168.1.2。然后A在自己的本地**ARP缓存**中检查B的匹配MAC地址。
第2步:如果A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。
【TCP/IP详解学习笔记(4)ICMP报文,ping程序、traceroute程序】
ICMP
IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。
ICMP封装在IP数据报内部,当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。书上的图6-3清楚的给出了错误类型和代码的组合代表的意思。
尽管在大多数情况下,错误的包传送应该给出ICMP报文,但是在特殊情况下,是不产生ICMP错误报文的。如下:
1. ICMP差错报文不会产生ICMP差错报文(除IMCP查询报文)(防止IMCP的无限产生和传送)
2. 目的地址是广播地址或多播地址的IP数据报。
3. 作为链路层广播的数据报。
4. 不是IP分片的第一片。
5. 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。
虽然里面的一些规定现在还不是很明白,但是所有的这一切规定,都是为了防止产生ICMP报文的无限传播而定义的。
ICMP的应用ping
大多数TCP/IP实现都在内核中直接支持ping服务器——这种服务器不是一个用户进程
ping还给我们一个看主机到目的主机的路由的机会。这是因为,ICMP的ping请求数据报在每经过一个路由器的时候,路由器都会把自己的ip放到该数据报中。而目的主机则会把这个ip列表复制到回应icmp数据包中发回给主机。但是无论如何,ip头所能纪录的路由列表是非常的有限。如果要观察路由, 我们还是需要使用更好的工具,就是要讲到的Traceroute(windows下面的名字叫做tracert)。
ICMP的应用Traceroute
Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。
Traceroute原理:
它收到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。
这过程中涉及到一个问题,即:如何判断UDP有没有到达目的主机呢?
traceroute使用了一个技巧。TCP和UDP协议有一个端口号定义,普通网络程序只监控少数几个号码较小的端口,如80,23等。。但是traceroute发送的是端口号>3000的UDP数据报,所以到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了。
【TCP/IP详解学习笔记(5)IP选路,动态选路】
查看路由表的方法:
(1)route
(2)netstat -r
IP选路规则:
每当主机要发送IP数据包,都要先搜索路由表,以确定往哪个接口发送数据,并确定下一站路由器,具体的搜索过程如下
(1)搜索匹配的主机地址;
(2)搜索匹配的网络地址;
(3)搜索默认路由。
如果通过以上三个步骤之后都没有匹配的路由项(没有默认路由),则产生主机不可达或者网络不可达ICMP差错报文。
进一步认识路由表:
root@hyx-virtual-machine:/# netstat -r
内核 IP 路由表
Destination Gateway Genmask Flags MSS Window irtt Iface
default localhost 0.0.0.0 UG 0 0 0 eth0
172.16.69.0 * 255.255.255.0 U 0 0 0 eth0
root@hyx-virtual-machine:/#
对路由表的说明
(1)Destination:目的IP地址或网络地址;
(2)Gateway:即下一站路由器,*表示无须经过下一站路由器就可以直接到达目的地址或目的网络;
(3)Genmask:子网掩码;
(4)Flags:标志字段,这里可能出现U,G,H,D,M,R等,U表示可用;G表示Gateway字段是个路由器,否则表示是个直接出口;H表示Destination是个主机IP地址,没有H表示Destination是网络地址;D表示该路由项由ICMP重定向报文创建;M表示该路由项由ICMP报文修改而来;R表示由动态选路协议恢复的路由项。
多数系统内核对路由表的实现都包含上述内容,其它字段视系统而定。
导致路由表发生改变的方法或原因:
(1)可以通过route add或者route del来增加或者删除路由项;
(2)ICMP重定向报文导致接收主机修改或者增加路由项;
(3)ICMP路由通告报文也往往会导致路由表发生变化;
(4)动态选路协议(RIP,OSPF等)导致路由表不断更新。
【TCP/IP详解学习笔记(6)IP分片】
可以用netstat -i来查看自己网络的MTU,如下:eth0的MTU是1500,本地环回接口的MTU是65536
root@hyx-virtual-machine:/# netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 187262 0 0 0 355 0 0 0 BMRU
lo 65536 0 576 0 0 0 576 0 0 0 LRU
root@hyx-virtual-machine:/#
但是这只是本主机所在局域网的MTU,当一个IP数据包企图跨网络进行传输时,情况要稍微复杂些,因为不同的网络可以有不同的MTU,IP数据包在传输过程中,只要有必要就会进行分片,这就是说,分片之后的IP数据包有可能再进行分片。一个IP包传输过程中所经过网络的最小MTU成为路径MTU。
【TCP/IP详解学习笔记(7)单播、广播、多播与IGMP】
单播:只有一个目的地址的封包帧,这是我们在 TCP/IP 网络中最常见的一种通信方式,当你用浏览器连接一个Web服务器的时候,建立的就是单播,当你用QQ和其他人聊天的时候,传输的也是单播。
广播地址分类:
(1)受限的广播地址,即255.255.255.255,目的地为255.255.255.255的数据包只能出现在本地网络中,路由器在任何情况下都不对这类数据包进行转发。
(2)指向网络的广播地址,即主机号为全1的IP地址。
(3)指向子网的广播地址为主机号为全1且有特定子网号的地址。
(4)指向所有子网的广播地址的子网号及主机号为全1。
广播IP地址一般对应的广播物理地址为ff:ff:ff:ff:ff:ff。
多播:可以说广播是多播的特例,多播就是给一组特定的主机(多播组)发送数据,这样,数据的播发范围会小一些(实际上播发的范围一点也没有变小),多播的MAC地址是最高字节的低位为一,例如01-00-00-00-00-00。多播组的地址是D类IP,规定是224.0.0.0-239.255.255.255。
IGMP:IGMP(Internet Group Management Protocol)作为因特网组管理协议,是TCP/IP 协议族中负责IP 组播成员管理的协议,它用来在IP 主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。IP主机通过发送IGMP 报文宣布加入某组播组;本地组播路由器通过周期性的发送IGMP 报文轮询本地网络上的主机,确定本地组播组成员信息。
【TCP/IP详解学习笔记(8)各层数据包格式及数据包分析】
【参考资料】
《TCP/IP详解卷1》
【体会】
阅读《TCP/IP详解卷1》过程中,真的是有好多读不懂的地方,只是知道讲的非常细。。。可能是自己基础太LOW了。。后来在网上找了两篇博文阅读,都是针对这本书的读书心得,阅读之后,最大收获是进一步理解了数据包的封装方式和格式,并且能够完全自己看懂wireshark捕获到的数据流,并能简单分析,有很多没有看到的知识,打算在以后研究wireshark的过程中慢慢补充,随时更新。