赞
踩
由于时间匆忙和作者水平有限,本文可能存在部分错误和描述含糊的地方,但均不影响读者理解。也希望各位可以提出批评,有空后也会加以改正。
本文理论部分图片和少部分描述来自学校教学课件,实验图片为作者自己实验后成功的截图,仅供教学使用。
建议先学习计网理论相关知识,再看相关实验。
本文使用的模拟仿真软件为Cisco Packet Tracer,抓包软件为WireShark,在网上均可下载。
祝学习顺利
本文包含的重要内容有:DHCP、DNS、HTTP、交换机基本设置、交换机工作原理、VLAN、静态路由、动态路由、NAT、ARP协议分析、TCP协议分析
1.EIA/TIA 568A 标准:白绿 绿 白橙 蓝 白蓝 橙 白棕 棕
2.EIA/TIA 568B 标准:白橙 橙 白绿 蓝 白蓝 绿 白棕 棕
在现实中多用第二种 记忆方法:先按白X X记忆,将绿蓝交换位置
一二的区别是13,26互换
直连线:两端为同一标准的双绞线
交叉线:两端分别为EIA/TIA 568B 和EIA/TIA 568A 排序的双绞线
直连线用于两种不同的设备之间,比如:1.主机和交换机或集线器;2.路由器和交换机或集线器
交叉线用于同种类型设备之间,比如:1.计算机与计算机连接;2. 交换机与交换机连接;3.交换机和集线器之间;4.主机和路由器之间
注意加粗重点
DHCP用于动态的自动分配IP地址
这里src指代源地址,dest指代目的地址,yiaddr指代被分配给请求主机的地址,而transaction ID指的是事务ID,事务ID可以理解为一次事务的标记,而67、68分别表示UDP服务器和客户端端口
由上图可知:
1.DHCP发现报文:发现报文中的源地址是0.0.0.0,因为此时还未分配,而目的地址是255.255.255.255,即广播地址。因为此时不知道发给哪个DHCP服务器。使用UDP68端口作为源端口,使用UDP67端口作为目的端口来广播请求IP地址信息
2.DHCP提供报文:提供报文中的源地址即为服务器IP地址,目的地址也为广播地址255.255.255.255,因为此时还未分配成功,并携带了即将给请求主机分配的IP地址233.1.2.4,这里客户主机是通过事务ID来分辨提供报文的(存疑)使用UDP67端口作为源端口,使用UDP68端口作为目的端口来广播请求IP地址信息
3.DHCP请求报文:请求报文就是主机确认接收该DHCP服务器提供的IP,因为发现报文是广播的,所以会有多个接收到的DHCP服务器为该主机提供IP,但最终主机只会接收其中一个,一般为第一个。但请求报文的源地址仍为0.0.0.0,因为还没有经过DHCP服务器的最终同意。目的地址也仍为广播,需要告诉别的DHCP服务器主机已经接收其他DHCP服务器提供的IP地址了。使用UDP68端口作为源端口,使用UDP67端口作为目的端口来广播请求IP地址信息
4.DHCP ACK报文:此时DHCP服务器确定该IP可用,便允许客户主机使用,因此ACK报文用于最后的确认。使用UDP68端口作为目的端口来广播请求IP地址信息
DNS是域名解析系统,以符号名字代替纯数字(IP地址)对计算机进行标识
由于数字过于抽象,用户很难记住每个域名的IP地址,因此使用DNS服务器将相应的域名转换成IP地址。而DNS域名服务器是分级的,即由浅到深,大部分网址都为com,少部分为xxx.com,最后www.xxx.com便唯一,也唯一对应一个IP。因此不同级别的域名服务器也只知道不同级别网址的IP。例如www.baidu.com,第一级域名服务器知道com的IP,下一级知道baidu.com的IP,以此类推,最后可以推出整个网址对应的IP
具体了解DNS需要系统学习计网原理,这里不作详细介绍
【根域名服务器】
最⾼层次、最重要的的域名服务器。根域名服务器知道所有的顶级域名服务器的域名和 IP 地址。不管是哪⼀个本地域名服务器,若要对互联⽹上任何⼀个域名进⾏解析,只要⾃⼰⽆法解析,⾸先求助于根域名服务器。
在互联⽹上共有 13 个不同 IP 地址的根域名服务器(13套),它们的名字是⽤⼀个英⽂字⺟命名,从 a ⼀直到 m(前 13 个字⺟)。
13台根服务器,主根部署在美国,12个辅根有9台在美国,1台在英国,1台在瑞典,1台在⽇本。
【顶级域名服务器】
是各顶级域名自己的名称服务器,负责他们各自管理的二级域名解析。
【权威域名服务器】
是针对dns区域提供名称解析服务而专门配置、建立的名称服务器,可为用户提供最权威的dns域名解析。
【本地域名服务器】
一般是指ISP提供的名称服务器(也就是本地DNS服务器),例如我们使用的114.114.114.114,Google的8.8.8.8。
递归查询:
即主机询问本地域名服务器,本地域名服务器询问根域名服务器,根域名服务器访问顶级域名服务器,以此类推,最后再逐层返回。这样会导致根域名服务器的工作量很大很大。因此递归查询并不常见
迭代查询:
即主机询问跟本地域名服务器,这一点从与递归查询是一致的。但是后续的不同,是以本地域名服务器为点,分别访问根域名服务器、顶级域名服务器等,即根域名服务器告诉本地域名服务器,下一个要访问的顶级域名服务器是哪一个,由本地域名服务器去访问顶级域名服务器,以此类推。这样所有的工作都是本地域名服务器完成的,根域名服务器等只需要告诉相应的本地域名服务器下一个要访问的下一级域名服务器是哪个即可
这里的首选域名服务器就是本地域名服务器
HTTP :超文本传输协议,也就是HyperText Transfer Protocol。
Web服务器:指驻留于因特网上某种类型计算机的程序
当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。
服务器使用HTTP与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。
目前最主流的三个Web服务器是Apache、 Nginx 、IIS。
这里需要用到WireShark抓包进行分析,具体分析放在后续协议分析的实验中,和其他实验一起讲
交换机是一种用于广电信号转发的网络设备,通俗来说,多个主机需要通过交换机来连接路由器,因为路由器接口较少,而交换机有很多接口,这样方便管理及后续使用
用户模式
Switch>
特权模式
Switch>enable
Switch#
配置模式
**Switch#configure terminal **
Switch(config)#
vlan配置模式
Switch(config)#vlan 10
Switch(config-vlan)#
接口配置模式
Switch(config)#interface fastethernet 0/0
Switch(config-if)#
若不知道要使用什么命令 可以使用?
例如:Switch(config)#interface ?
交换机会自动跳出可能的选项
若要补齐命令可以用Tab
% Ambiguous command: "show c“
用户没有输入足够的字符,网络设备无法识别唯一的命令,较为模糊
% Incomplete command.
用户没有输入该命令的必需的关键字或者变量参数
% Invalid input detected at ‘^’ marker.
用户输入命令错误,符号(^)指明了产生错误的单词的位置
网络拓扑图:
1、配置交换机管理IP
Switch(config)#interface vlan 1 //进入vlan 1接口
Switch(config-if)#ip address 192.168.1.1 255.255.255.0 //为vlan 1接口上设置管理IP
Switch(config-if)#no shutdown //开启vlan 1端口
2、配置telnet密码
Switch(config)#line vty 0 4 //进入虚拟终端模式
Switch(config-line)#password 123456 //将telnet密码设置为123456
Switch(config-line)#login //启用需输入密码才能telnet成功
3、配置特权模式密码
Switch(config)#enable password 123456 //配置进入特权模式密码
首先要了解MAC地址。MAC地址又称为物理地址由48位二进制数组成,通常表示为12个16进制数,如:00-50-56-C0-00-01。前24位是厂商识别码,后24位是节点标识符,可以认作每一个端口的物理标识
分为单播、组播、广播三种类型
单播:第1个字节的最低位为0,可作为目的地址和源地址
组播:第1个字节的最低位为1,仅能作为目的地址
广播:48位全部为1
在交换机内部有一张MAC地址表,其存放了每个端口对应的MAC地址,即用于存放物理地址与交换机端口映射关系的数据库,也是交换机用于转发的依据
转发表格式如下:
其中包含所属VLAN,MAC地址,类型及对应接口
其中,类型若为静态,则该MAC地址映射关系不会自动修改,若为动态,则一段时间后交换机会重新询问并更改
一个新的交换机的MAC地址表是没有任何对应MAC地址的,因此需要地址学习,地址学习的规则如下:
总体实验步骤:
将PC1、PC2、PC3的MAC地址信息写入MAC地址表中,机号与端口号对应。
例:
Switch(config)#mac-address-table static 00d0.f838.0003 vlan 1 interface fastethernet 0/3
将PC3的MAC地址信息从MAC地址表中删除。
例:
Switch(config)#no mac-address-table static 00d0.f838.0003 vlan 1 interface fastethernet 0/3
此处Fa0/1连接PC1,Fa0/2连接PC2,若PC2连接Fa0/4,便ping不通,因为交换机只会转至Fa0/2。而动态路由会自己建立,因此无论怎么pingPC3都是通的
因为广播域过大会引起宽带浪费,安全性降低和不易管理等麻烦,因此我们需要分割广播域,在分割广播域过程中,若使用路由器分割,则成本较高,因此使用虚拟局域网VLAN
VLAN是虚拟局域网的英文简称。虚拟局域网是指局域网的划分并不是实体的划分,其在一个网络中,通过设置将一个网络中的主机划分到多个虚拟子网中,每一个虚拟子网就是一个VLAN。具体学习请系统学习计网理论
1.Access端口
该端口为接入端口,通常用于连接主机和交换机。每一个Access端口仅属于一个VLAN,其发送的帧是不带有VLAN标签的
2.Trunk端口
该端口多用于交换机之间的连接。其可设置VLAN列表,**即一个Trunk端口可对应多个VLAN
**,每个端口只转发带有相同或处于列表中VLAN的帧
即默认VLAN,默认所有端口都在vlan1里,又叫缺省vlan1。
设置缺省vlan是省去了用户配置的环节,让所有的端口都能通用,但有的交换机默认没有缺省vlan,也就是所有的口都不通,需要自己配置vlan才能使用。缺省,即系统默认状态(default),意思与“默认”相同
特别的,Trunk接口两端的缺省VLAN必须相同
创建VLAN:
Switch(config)#vlan vlan-id
删除VLAN:
Switch(config)#no vlan vlan-id
查看VLAN
Switch#show vlan brief
向VLAN内添加一个端口:
Switch(config)#interface interface-id
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan vlan-id
向VLAN内添加一组端口:
Switch(config)#interface range port-range
Switch(config-if-range)#switchport mode access
Switch(config-if-range)#switchport access vlan vlan-id
将端口设置成Trunk端口:
Switch(config)#interface interface-id
Switch(config-if)#switchport mode trunk
为Trunk端口指定缺省VLAN(两端一致):
Switch(config-if)#switchport trunk native vlan vlan-id
一般默认为VLAN 1
Trunk端口的许可VLAN列表:
**Switch(config-if)#switchport trunk allowed vlan { all | [add| remove | except] vlan-list } **
all:许可列表包含所有支持的VLAN
add:将指定VLAN列表加入许可VLAN列表。
remove:将指定VLAN列表从许可VLAN列表中删除。
except:将除列出的VLAN列表外的所有VLAN加入许可VLAN列表
首先,设置VLAN
再将端口加入相应VLAN
接着便设置Trunk端口
之后同一VLAN之间的主机可以相互ping通,不同VLAN之间的就不行
当一个交换机上的主机属于不同的网络时,此时他们便无法通信,这时就需要用路由器来连接两个网络。与交换机相似,路由器中也有一张转发表,其中包含了发送至某个网络的数据应当往哪里转发。静态路由则是管理员事先设置好的固定路由信息,其不会自动变更,因此较适应一些小型网络
配置接口IP作为所连接网络的网关。
Router(config)# interface interface-id
Router(config-if)# ip address ip-address mask
Router(config-if)# no shutdown
配置静态路由。
Router(config)# ip route prefix mask ip-address
查看路由信息。
Router# show ip route
Gateway of last resort is not set
C 192.168.1.0/24 is directly connected, FastEthernet0/0
C 192.168.2.0/24 is directly connected, FastEthernet0/1
S 192.168.3.0/24 [1/0] via 192.168.2.2
通过192.168.2.2的端口,访问所有24位子网掩码的目的网络
Router(config)# ip route 0.0.0.0 255.255.255.0 192.168.2.2
通过192.168.2.2的端口,访问所有网络。(用于边界路由)
Router(config)# ip route 0.0.0.0 0.0.0.0 192.168.2.2
配置默认网关并设置静态路由
由于VLAN是广播域,不同广播域之间是相互隔离的。因此若VLAN间要实现通信必须借助路由器或三层交换机
单臂路由是指多个VLAN共用路由器的一个端口
方法便是将路由器的端口进一步细分成更小的,每一个VLAN都占据一个细分端口
缺点:
路由器转发速度有限,无法满足VLAN间通信数据量大的需求,并且容易造成单点故障
数据在物理链路上往返传输,会有转发延迟,很可能成为局域网性能瓶颈
可能用到的命令:
将路由器接口配置为干道模式,且去掉接口上的IP地址
Router(config)# interface interface-id
Router(config-if)# no ip address
Router(config-if)# no shutdown
进入子接口、封装802.1Q并指定VLAN ID号、配置IP地址
**Router(config)# interface type slot/number.subinterface-number
Router(config-subif)# encapsulation dot1q vlan-id
Router(config-subif)# ip address ip-address mask **
查看路由表信息
Router# show ip route
搭建如下拓扑并完成相应通信
PC0属于VLAN10,PC1属于VLAN20
![在这里插入图片描述
实验步骤:
交换机部分:
设置VLAN
给不同的VLAN加入相应端口
设置Trunk端口
打开端口:
设置VLAN:
给不同的VLAN加入端口:
设置Trunk端口:
路由器设置:
进入干道模式,去掉端口IP并打开端口
细分子端口,并设置对应网关
显示路由表
进入干道模式,去掉端口IP并打开端口:
细分子端口并设置对应网关——这步最关键
这步做好后一定要记得去PC机里设置默认网关!
显示路由表:
接下来在PC0上pingPC1即可ping通
三层交换机实现VLAN间通信的方法是在已有的VLAN上创建虚接口,它同样可以配置IP地址,借助虚接口三层交换机能够实现路由转发功能。
优点:
VLAN间流量不必经过路由器,网络延时和抖动都很小,同时也极大程度的减轻上层接入路由器的负载。
三层交换机的VLAN间路由由交换机的三层转发引擎完成,其性能取决于交换机的背板转发速率,可以在多个端口上轻松实现线速转发,可以获得很好的性能。
事实上,网络一般分层设计,三层交换机一般很少用于接入层。
可能用到的命令:
创建VLAN:
Switch(config)# vlan vlan-id
向VLAN内添加端口:
Switch(config)# interface interface-id
Switch(config-if)# switchport access vlan vlan-id
配置SVI:
Switch(config)# interface vlan vlan-id
Switch(config-if)# ip address ip-address mask
开启路由功能:
Switch(config)# ip routing
查看路由表:
Switch# show ip route
根据如下拓扑图搭建实验
二层交换机操作:
三层交换机操作:
这边要记得no shutdown
结束后要打开交换机ip routing
须注意的是,如默认网关,IP地址这类在图中并没有显示,一定要自己设置好
RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量值来衡量到达目的地址的距离。
在RIP网络中,缺省情况下,设备到与它直接相连网络的跳数为0,通过一个设备可达的网络的跳数为1,其余依此类推。也就是说,度量值等于从本网络到达目的网络间的设备数量。
为限制收敛时间,RIP规定度量值取0~15之间的整数,大于或等于16的跳数被定义为无穷大,即目的网络或主机不可达。由于这个限制,使得RIP不可能在大型网络中得到应用。
由上图所示,路由表中存在三个信息,目的网络、下一跳网络和跳数。当路由器A收到路由器B的路由更新时,其会检查自己的路由表,若该网络存在,则将已储存跳数和路由器B的跳数相比较,同时检查下一跳网络是否一致,若路由器B发来的信息中,某一网络的跳数更小且下一跳网络不同或更大且下一跳网络相同(可能原先路由线路中新增了部分路由器),则+1并更新,若更大且下一跳网络不同,便不更新。若某网络不存在,则储存该网络,并将跳数+1
当然,不同路由器之间也根据是否能收到路由更新来反映对方路由器可不可达,同时,这也是保证路由表信息正确的方法,即及时的更新路由表信息,来保证信息的正确性,这里就需要设计计时器。一共有三种计时器:
第一个为更新计时器,其为30s,即每隔30s发送一次路由更新。
第二个为无效计时器,其为180s,若180s内未收到某路由器的路由更新,则将该路由器标记为16跳(即不可达),即变为无效路由
第三个为刷新计时器,若240s内都未收到无效路由的路由更新,便删除该记录
下表为RIP工作流程图:
路由毒化(好)
路由毒化用一句话来总结:当路由器A检测到一个路由条目不可达的时候不会直接删除,而是会将该路由条目的metric置为16跳(毒化),然后再泛洪给其他所有路由器,保证其他路由器同样可以收到该条目不可达的消息
错误更新(坏)
即在路由器C发送毒化路由信息前,其他路由器发送了路由更新,导致路由器C对毒化路由的记录出现了问题。使毒化路由的信息无法泛洪告知其他路由,即其他路由仍认为某个毒化路由可通
由上图可见路由器C接受了错误信息
路由环路(坏)
由于存在错误更新,路由器BC之间会不断传播错误的信息直至16跳不可达才会停止。这是对网络资源的极大浪费
防止路由环路的方法:
定义最大值;
路由跳数一旦达到最大值16,就视为网络不可到达,存在故障,将不再接受来自访问该网络的任何路由更新信息。
水平分割
路由器记住每一条路由信息的来源,并且不在收到这条信息的端口上再次发送它 .
路由毒化;
使用无穷大的度量(16跳)传播关于路由失效的坏消息。
毒化逆转;
当路由器学习到一条毒化路由(度量值为16)时,对这条路由忽略水平分割的规则,并通告毒化的路由。
抑制计时器;
在抑制时间内,失效的路由不接受任何更新信息,除非这条信息是从原始通告这条路由的路由器来的。一般180S。
触发更新。
在改变一条路由度量时立即广播一条更新消息,而不管30秒更新计时器还剩多少时间。
RIV1:
RIV1较为简单,其使用广播的方式发送路由更新信息。由于其不携带子网掩码,属于有类路由协议,因此不支持VLSM:可变长子网掩码Variable Length Subnet Mask 和 CIDR:无类别域间路由Classless Inter-Domain Routing,同时也不支持认证
RIV2:
RIV2则较为复杂,其通过报文组播的方式发送路由更新信息,组播地址为224.0.0.9 。路由信息中加入了子网掩码,为无类路由协议,支持 VLSM,支持路由聚合与 CIDR,且支持明文认证和 MD5 密文认证。
可能用到的命令:
启动RIP进程
Router(config)# router rip
定义关联网络
Router(config-router)# network network-number
定义RIP的版本
**Router(config-router)# version {1 | 2} **
关闭自动汇总(v2)
Router(config-router)# no auto-summary
查看路由更新过程
Router# debug ip rip
查看路由信息
Router# show ip route
Router# show ip rip database
Router#show ip protocols
清空路由信息
**Router# clear ip route ***
RIPV1实验步骤:
1.转向边缘网络: int loopback 0
2. 加入左端的lo0IP地址:ip add 1.1.1.1 255.255.255.0
3. 转向接口gig0/0:int gig0/0(gig为实现过程中的端口名称,即替换拓扑图中的fa)
4. 向接口处添加IP地址:ip add 12.1.1.1 255.255.255.0
5. 防止接口关闭:no shutdown
6. 调整RIP:router rip
7. 选择模式:version 1
8. 加入相应的网络:net 1.0.0.0 net 12.0.0.0
Router1的操作
Router2:
漏配loopback 0,可根据拓扑图自行配置
Router3:
RIPV2实验步骤:
其余步骤与RIPV1一致,只是选version 2并在后面加入 no auto-summary
Router1:
Router2:
Router3:
众所周知,所有的网络通信都需要IP来标识主机,但随着电子产品的不断增多,IPv4中的IP地址已经严重不足,在IPv6完全代替IPv4之前,人们便想出了其他方法来减缓IPv4地址严重不足的问题,这个方法就是NAT
互联网是由多个网络组合而成的,人们便想到,如果一个网络内部的多个主机可以将内部网络的IP地址映射成外部网络的IP地址进行交互,这便是静态NA或动态NAT,这样当内部主机不需要访问外网时,便会节约许多IP地址。或者让一个网络内部的多个主机通过同一个外部网络IP地址进行交互,那便大大减少了IP地址的使用量,这便是NAPT
静态NAT
静态NAT是将每一个内部网络私有IP与一个外部网络公有IP进行一对一的匹配,即当内部主机需要访问外网时,便会以这个外部网络公有IP作为合法IP地址进行数据交互
动态NAT
动态NAT是在路由器内设置一个IP地址池,这个地址池内有一连串的IP地址,内部网络私有IP会随机转换成地址池中的合法公有IP和外网进行数据交互
NAPT
NAPT是指将多个内部私有IP转换为同一个合法公有IP和外网进行数据交互
静态NAT
静态NAT可能用到的命令:
指定一个内部接口和一个外部接口
**Router(config-if)# ip nat { inside | outside } **
连接内部网络的称为内部接口,外部接口亦然
配置静态转换条目(IP和端口)
Router(config)# ip nat inside source static tcp local-ip local-port global-ip global-port
这条命令的意思是将内部IP local-ip 转换为外部公有IP global-ip 和外网进行数据交互
网络拓扑图如下:
实验步骤:
首先先配置主机及服务器的内部ip地址,默认网关,子网掩码
再配置路由器各端口ip地址,并打开端口
以上步骤不再截图,因为和之前的一致
接下来讲述重点:
第一点,配置静态路由,静态路由是保证路由器在路由表中没找到需要转发的网络时,默认转发的条目,就是静态路由,即若从10.1.1.10处访问1.1.1.10,可是路由器的路由表中没有1.1.1.1这个网络,其便会按照静态路由转发,我们就需要让路由器0在找不到网络时向路由器1转发
即 ip route 0.0.0.0 0.0.0.0 2.2.2.2
命令含义在之前实验中有
第二点就是配置静态NAT,就是命令里面的内容,设置内外接口并设置静态NAT
下图是路由器0的配置,路由器1模仿即可
配置完后用主机10.1.1.10浏览器ping1.1.1.10即可ping通
动态NAT
动态NAT与静态NAT的不同就是其设置了一个地址池,IP转换并不唯一了,只要有空闲IP都可以转换
动态NAT可能用到的命令:
指定一个内部接口和一个外部接口
**Router(config-if)# ip nat { inside | outside } **
定义IP访问控制列表
Router(config)# access-list access-list-number { permit | deny } any
这边直接配为permit any即可
定义一个地址池
Router(config)# ip nat pool pool-name start-ip end-ip netmask netmask
配置动态转换条目
Router(config)# ip nat inside source list access-list-number pool pool-name
查看NAT信息
Router# show ip nat statistics
Router# show ip nat translations
与静态NAT唯一的区别就是将静态NAT的第二个重点换成地址池即可
NAPT也与动态NAT类似,只是地址池内只有一个IP地址,并且后面使用overload
可能用到的命令:
指定一个内部接口和一个外部接口
**Router(config-if)# ip nat { inside | outside } **
定义IP访问控制列表
Router(config)# access-list access-list-number { permit | deny } any
定义一个地址池
Router(config)# ip nat pool pool-name start-ip end-ip netmask netmask
配置动态转换条目
Router(config)# ip nat inside source list access-list-number pool pool-name overload
注意:
也可以不设地址池,用外部接口IP作为内部全局IP地址
Router(config)# ip nat inside source list access-list-number interface interface-name overload
众所周知,每台主机都有IP地址与MAC地址,在传送数据的过程中,二者缺一不可。ARP就是用于获取目的主机MAC地址的。每个主机都会有一张ARP表,来存储对应主机的IP地址和MAC地址。
步骤如下:
示例如下:
主机A的IP地址为192.168.2.10,MAC地址为54-89-98-f6-16-c0
主机B的IP地址为192.168.3.20,MAC地址为54-89-98-15-3a-5c
现在主机A要发送消息给主机B,其只知道主机B的IP地址。
发送ARP请求报文:
源IP地址:192.168.2.10
源MAC地址:54-89-98-f6-16-c0
目的IP地址:192.168.3.20
目的MAC地址:00-00-00-00-00-00
主机B存储相应信息到ARP表
发送ARP响应报文:
源IP地址:192.168.3.201
源MAC地址:54-89-98-15-3a-5c
目的IP地址:92.168.2.10
目的MAC地址:54-89-98-f6-16-c0
主机A再发送其他信息
Hardware type :硬件类型,标识链路层协议
Protocol type: 协议类型,标识网络层协议
Hardware size :硬件地址大小,标识MAC地址长度,这里是6个字节(48bit)
Protocol size: 协议地址大小,标识IP地址长度,这里是4个字节(32bit)
Opcode: 操作代码,标识ARP数据包类型,1表示请求,2表示回应
Sender MAC address :发送者MAC
Sender IP address :发送者IP
Target MAC address :目标MAC,此处全0表示在请求
Target IP address: 目标IP
用WireShark抓包ARP,通过访问学校FTP为例
实验步骤:
ARP请求报文:
ARP响应报文:
TCP是可靠的数据传输协议,其为面向连接,面向字节的一对一传输协议(即TCP协议是点对点协议,会专门建立TCP传输通道),TCP协议的首部最小为20字节,最大为60字节。其与UDP的区别如下表:
** ** | UDP | TCP |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能一对一 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
使用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
如下表:
端口号:
用来标识同一台计算机的不同应用进程,即不同进程应用不同的端口号
序号:
本报文段发送的数据组的第一个字节的序号
在TCP传送的流中,每一个字节一个序号。例如一个报文段的序号为300,此报文段数据部分共有100字节,即为300-399共100个字节,下一个报文段的序号为400
确认号:
指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。
数据偏移/首部长度:
指示了数据区在报文段中的起始偏移值,偏移量的前面部分就是首部,因此也称为首部长度。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,即最小为0101。 首部长度以4字节为单位。1000转化为10进制为8,8*4=32,报头长度为32字节。
(保留位到如今也没什么实际含义)
标志位:
每一个标志位表示一个控制功能。
URG:紧急指针(urgent pointer)有效。ACK:确认序号有效。PSH:接收方应该尽快将这个报文交给应用层。RST:重置连接。SYN:发起一个新连接。FIN:释放一个连接。这个在后续介绍三次握手和四次挥手的过程中很重要
窗口:
滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小16bit,因而窗口大小最大为65535
校验和:
奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据
紧急指针:
TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式,用于指明紧急数据的长度。若紧急指针不为0,则可以移至队列前面读取
选项和填充:
最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size)(在第一个TCP报文)。选项长度不一定是32位的整数倍,所以要加填充位
数据部分:
TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部
以上图为例作解释
前面提到,TCP是点对点连接,其有专用的传输信道。即其应该有建立连接的过程,整个过程需要发送三个报文,因此被称为三次握手。上图就是三次握手的过程
首先要解释seq和ack。seq是指自身的序列号,即自身携带的数据是从哪一个序列号,开始的,也是上一个报文的ack值(在正常数据传输过程中,三次握手和四次握手过程中不一定遵循),ack值就是该报文请求的下一个序列号,即发出该报文的主机希望收到ack代表的序列号的数据
首先第一个报文:
第一个报文的SYN位为1,表示该报文为同步请求报文,即请求建立连接。后面的seq是一个随机的序号,由于TCP协议规定,SYN非0的报文不得携带任何数据,因此该序号没有任何含义,只是该报文要求携带一个随机的序号
第二个报文:
第二个报文的SYN=1,表示其也为同步报文。ACK=1表示确认,seq=y也是随机序号,无任何含义。ack=x+1表示的是其数据接收是从x+1位开始的,但由于第一个报文中的seq没有任何含义,所以该ack的取值只是遵循了规则, 也无任何含义
第三个报文:
第三个报文的ACK=1,也指代确认报文。seq=x+1无意义,ack也是遵循规则
如果没有第三次握手,则若第二次握手的报文丢失,会导致主机未收到服务器的确认报文,但服务器认为主机应已经收到,便开启TCP通道,而主机未接入TCP通道但服务器已经开启
那么在关闭TCP传输通道的时候,也需要报文的交互来互相告知。这便是四次挥手。关闭的请求可以由服务器提出,也可以是主机
第一个报文:
可以由服务器发出,也可以由主机发出。FYN=1,表示该报文为释放报文,即终止请求报文。seq=u且ack=v(图中未显示),ack=v是对上一个报文的确认。该报文发送后,发送端只能接收,不再发送
第二个报文:
ACK=1,表示其为确认报文,seq=v和上一报文ack=v衔接。ack=u+1表示希望接收的信息,该处并无实际意义,因为主机已经不能再发送了
第三个报文:
FIN=1表示服务器请求关闭,ACK=1表示确认报文,仅为格式要求。seq=w无含义,ack=u+1是对上一报文的重复确认,也是遵循规则
第四个报文:
表示主机确认收到服务器的释放请求,即ACK=1代表确认,seq=u+1和ack=w+1都是遵循规则,无实际含义
但是单纯的通过报文进行释放建立的交互难免会有报文出错,丢失的情况,因此TCP协议还设有保活计时器,没收到一个报文保活计时器就刷新,若保活计时器超时,则判断为一端有故障,随即关闭TCP连接
就是上一个实验的同样内容,只是这次查看TCP报文罢了
这里介绍一整个HTTP数据的传输过程
回顾之前的实验,我们可以发现,先前的DHCP、ARP、TCP等等都是在为发送数据服务,而交换机、路由器也是参与数据传输服务的硬件部分。只是他们分别负责其中的某一部分,例如DHCP请求IP地址,ARP搜寻MAC地址,TCP负责可靠传输。一个HTTP数据从源主机到目的主机的整个过程,都需要这些协议的参与
这部分包含三个环节
首先是URL的解析,在先前实验中我们已经知道,一个页面的URL是通过层层DNS服务器解析后,方才转换成IP地址的,这部分不再详述,可以参考DNS实验部分
紧接着便是发送HTTP数据
通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈,协议栈是操作系统的一部分,其上半部分便是UDP与TCP协议,下半部分是IP协议。
TCP刚刚在上一个实验中介绍过,应该不会陌生,虽然三次握手和四次挥手可能介绍的不是那么清晰(需要具体学习计网理论后才会有完整清晰的认识),但在HTTP数据发送过程中,上个实验中的介绍内容已经足够。
TCP的数据分割:
这部分内容在计网理论中会详述。这边只需要知道,TCP协议的每个报文携带数据是有最大长度限制的,因此若HTTP数据过大,需要划分为多个TCP报文,一个个发送。具体发送过程和相应数据可以参考其他HTTP协议的详细文章(寒假再写)。
TCP的任务便是在每一段数据的头部添加TCP头部,来确保可靠传输
之前的实验中我们详细介绍了IP数据报的具体格式与内容。TCP头部之前就要加入IP头部来引导方向。源IP地址即源主机IP地址,而目的IP地址是通过DNS解析URL后得到的IP地址
在之前,ARP协议早已帮我们找到了下一个要转发的路由器的MAC地址,HTTP数据根据一跳一跳的路由器逐渐走下去,最终才会到达目的服务器。
在这里,必须明确强调,在发送HTTP数据的整个过程中,源IP地址和目的IP地址一直不会改变,而目的MAC地址会随着下一跳路由器的改变而改变,即其仅指代下一跳路由器的MAC地址
网卡驱动从 IP 模块获取到包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
最后网卡会将包转为电、光或无线信号,通过网线发送出去
2. 交换机
HTTP数据会由交换机负责找到目的MAC地址对应的端口,将HTTP数据发往下一个路由器或服务器
3. 路由器
根据RIP协议,路由器知道如何将该HTTP数据转发至下一跳路由器或直达目的网络。因为路由器早已通过泛洪学习了相应网络及需要转发的下一个路由器的端口IP地址
至此,整个HTTP数据的传输过程就解析完了
到这里,计网实验部分的内容就结束了,很高兴你们可以看到这里。这篇文章是即兴写的,也是为了作者自己的期末复习,那么就祝看到这的各位考试顺利!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。