ARP协议 网络层
ARP协议
ARP协议的作用
Address Resolution Protocol
通过解析网络层地址(IP地址)来找寻数据链路层地址(MAC地址)的网络传输协议
工作流程
- 到ARP缓存表中寻找对应IP地址的ARP缓存
- 如果ARP缓存表中没有找到目的主机的MAC地址,则广播一个ARP请求报文到本地网络. 主机收到ARP请求报文后校验是否是自己的IP地址,如果不是则丢弃
- 目的主机收到ARP请求报文后,将源主机的IP地址和MAC地址映射加入到自己的ARP缓存表中
- 目的主机发送ARP应答报文给源主机
- 源主机收到目的主机的ARP应答报文后, 将IP和MAC地址映射加入ARP缓存表
ARP缓存
作用: 减少广播量
格式
Internet Address | Physical Address | Type |
---|---|---|
192.168.56.255 | ff-ff-ff-ff-ff-ff | static |
244.0.0.22 | 01-00-5e-00-00-16 | static |
229.255.255.250 | 01-00-5e-7f-ff-fa | static |
10.243.152.1 | 00-11-22-33-44-55 | dynamic |
10.81.0.1 | F4-4c-7f-76-76-e3 | dynamic |
类型列的“动态”表示使用ARP请求广播动态获取到的条目,“静态”表示是手工配置和维护的ARP表。
ARP缓存表更新机制
Linux arp 表 老化机制
ARP表的老化时间
不同系统的ARP表老化时间不同,Windows2000/XP系统ARP表项的老化时间是2分钟,95/98以及NT系统是10分钟,大部分Cisco交换机是5分钟,华为的设备一般是20分钟……这些时间可以通过系统注册表或者设备的相关命令进行设置。
ARP表老化时间定时器的重置
满足以下任一条件时,设备的ARP表项的老化时间定时器会重置:
1.设备相应的ARP表项更新时;
2.设备调用(引用)ARP表项转发数据后。
ARP数据包
ARP请求包
长度: 28字节
请求和应答的区分
01 请求
10 应答
11 RARP请求
100 RARP应答
逆地址解析协议(Reverse Address Resolution Protocol,RARP)
ARP 命令 //TODO
期中例题
- 试简单描述 ARP 协议的作用和工作过程。
- 以上数据包是 ARP 协议中哪种类型的数据包?
- ARP 协议是否只能用在 IP 网络中?试解释原因。
- ARP 数据包长度是固定的吗?试解释原因。
- 为什么在以上 ARP 数据包中需要提供 Sender MAC address 和 Sender IP address?
-
试写出该 ARP 数据包的下一个 ARP 数据包。
-
ARP协议的作用和工作流程
- ARP协议用于已知目标主机的IP地址,通过ARP协议获得他的MAC地址
工作过程:
- 主机广播一个ARP请求报文,,报文中包含目标主机IP地址
- fix 主机到ARP缓存中寻找目对主机的地址映射
- 目标主机收到ARP请求后,fix将源主机的IP和MAC地址映射加入自己的ARP缓存表, 并把自己的MAC地址和IP地址映射通过ARP应答报文发送给源主机
-
以上数据包是ARP协议中的请求(request)数据包
-
ARP协议只能用于IP网络中,因为它的作用就是已知IP地址寻找MAC地址。
-
ARP数据包的长度是固定的,因为ARP数据包的作用比较简单,报文中的内容结
构固定,所以ARP数据包的长度固定为28字节
- 如果不提供源主机的MAC地址和IP地址,那么收到这个ARP数据包的目的主机就 不知道是从哪台主机发来的,不知道该回复给谁。源主机就收不到目的主机的 ARP回复
Address Resolution Protocol (reply)
Hardware type: Ethernet(1)
Protocol type: IPv4(0x0800)
Hardware size: 6
Protocol size: 4
Opcode: reply(2)
Sender MAC address: ----MAC Address----
Sender IP address: 192.168.1.1
Target MAC adress: HonHaiPr_6c:a2:53(90:fb:a6:6c:a2:53)
Target IP address:192.168.1.100
IP/ICMP协议 网络层
网际协议(英语:Internet Protocol,缩写:IP),又称互联网协议,是用于分组交换数据网络的协议
IP路由表
Network Target | Netmask | Gateway | Interface | Metric |
---|---|---|---|---|
0.0.0.0 | 0.0.0.0 | 10.136.0.1 | ||
10.136.0.0 | 255.255.240.0 | On-Link | 10.136.5.155 | 4506 |
127.0.0.0 | 255.0.0.0 | On-Link | 127.0.0.1 | 4556 |
192.168.137.0 | 255.255.255.0 | On-Link | 192.168.0.1 | 4506 |
224.0.0.0 | 240.0.0.0 | On-Link | 127.0.0.1 | 4556 |
255.255.255.255 | 255.255.255.255 | On-Link | 192.168.0.1 | 4506 |
Tips: “在链路上”英文On-Link,字面意思就是在链路上。表示不需要通过路由器转发,可以直接与其通信的意思。
分类
IPv4 & IPv6
作用
特殊的端口号和IP地址
IP Addr. | Info |
---|---|
0.0.0.0 | 无效地址 |
x.x.x.0 | 网络地址 |
255.255.255.255 | 受限的广播地址 |
x.x.x.255 | 广播地址 |
127.0.0.1 (localhost) | 回环地址 |
10.0.0.0~10.255.255.255 | A类私有地址 |
172.16.0.0 ~172.31.255.255 | B类私有地址 |
192.168.0.0~192.168.255.255 | C类私有地址 |
Port | Protocol |
---|---|
7 | Echo |
21 | FTP |
23 | Telnet |
25 | SMTP |
53 | DNS |
80 | HTTP |
109 | POP3 |
443 | HTTPS |
子网掩码
子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
- 通过子网掩码,就可以判断两个IP在不在一个局域网内部。
- 子网掩码可以看出有多少位是网络号,有多少位是主机号
IP选项
IP选项 :分为3部分
- 代码Code 1字节:选项的作用、类型和是否被复制
- EOL 选项结束
- NOP 无操作
- RR 记录路由: 记录数据在Internet中传送的路由。分割时不复制
- SSRR 严格的源路由:用于源主机预先指定数据报在Internet中传送的路由,并且记录传送过程中经过的路由。分割时必须复制
- LSRR 宽松的源路由:对传送路由的要求不及SSRR严格,允许数据报经过任何非指定的路由器
- TS 时间戳 :记录数据报每经过一个网关时记录下当地时间。分割时不需复制,仅存在于第一个数据报中
- 长度Length 1字节:选项的总长度
- 数据Data
源路由
SSRR严格源路由:用于源主机预先指定数据报在Internet中传送的路由,并且记录传送过程中经过的路由。分割时必须复制
LSRR松散源路由:对传送路由的要求不及SSRR严格,允许数据报经过任何非指定的路由器
默认网关
网关(Gateway,又称为下一跳服务器)
IP数据报结构
- 版本号: 4位
- 首部长度: 20B min 60B max
- 校验和
- 区分服务类型 3+4+1
- 3位优先级
- 4位 服务类型DTRC
- 1000 最小时延
- 0100 最高可靠性
- 0010 最大吞吐量
- 0001 最小代价
- 总长 16位
- 数据报标识 16位
- 标识位 3位
- 0 (预留)
- DF 0时表示可分隔
- MF 1时表示还有数据报
- 片偏移 13位 (单位8字节)
- 生存时间 8位 max255
- 协议 8位
- 0 保留
- 1 ICMP
- 2 IGMP
- 6 TCP
- 14 TELNET
- 17 UDP
- 89 OSPF
- 首部校验和 16位
- 源地址 32位
- 目的地址 32位
- 填充Padding-将数据报总长度补齐为4字节的整数倍
期中真题
1)该数据包是 IPv4 的数据包,还是 IPv6 的数据包?为什么需要提出 IPv6 协
议?
2)该数据包的源地址和目的地址是多少?
3)该数据包的首部长度是多少,是固定的吗?
4)简述该数据包中的 Time to Live 字段的作用。
5)该 IP 数据包所承载的数据是什么协议的数据包?该协议属于哪一层?简述 该协议的作用。
6)该数据包在 windows 平台下,是由哪一个命令产生的?在默认情况下,你预计该数据 包会重复出现几次?
-
该数据包是IPv4数据包 提出IPv6是因为IPv4的地址是有限的,且即将被用完
-
源地址:192.168.1.100 目的地址: 192.168.1.1
-
首部长度 20字节 IP数据包的首部长度不是固定的,IP数据包首部中有可选字段,首部长度范围
20~60字节
-
Time to live 即TTL,用于限制报文在网络中传输的周期,如果不设置TTL,报文可能会在网络中无限期转发,消耗网络资源。
IP数据包中的TTL每经过一个路由就会减1,当TTL减为0时,IP数据包就会被判定 为无效数据包而被丢弃
存活时间(英语:Time To Live,简写TTL)是电脑网络技术的一个术语,指一个数据包在经过一个路由器时,可传递的最长距离(跃点数)。
其设计目的是防止数据包因不正确的路由表等原因造成的无限循环而无法送达及耗尽网络资源。
-
该数据包是ICMP数据包,属于网络层 ICMP协议 即互联网控制消息协议 常用于返回互联网控制信息
-
该报文是由ping命令产生的,预计改数据包会发送4次
ICMP 协议
互联网控制消息协议(英语:Internet Control Message Protocol,缩写:ICMP)
ICMP 报文结构
- Type:ICMP报文l类型,用于标识错误报文
- 0 Echo Reply
- 8 Echo Request
- 3 Unreachable
- 11 ICMP Timeout
- 13 Timestamp Request
- 14 Timestamp Reply
- Code:用于划分ICMP的类型,查找产生错误的原因
- Checksum:Internet校验和
- Rest of Header:根据不同的ICMP类型有所不同
网际协议第6版(英語:Internet Protocol version 6,縮寫:IPv6)是网际协议的最新版本,用作互联网的協議。用它来取代IPv4主要是为了解决IPv4地址枯竭问题,同时它也在其他方面对于IPv4有许多改进。
ping & tracert
ping [/t] [/a] [/n <count>] [/l <size>] [/f] [/I <TTL>] [/v <TOS>] [/r <count>] [/s <count>] [{/j <hostlist> | /k <hostlist>}] [/w <timeout>] [/R] [/S <Srcaddr>] [/4] [/6] <targetname>
参数 | 说明 |
---|---|
/t | 指定 ping 继续向目标发送回显请求消息,直到中断。 若要中断并显示统计信息,请按 CTRL+ENTER。 若要中断并退出此命令,请按 CTRL+C。 |
/a | 指定对目标 IP 地址执行反向名称解析。 如果此操作成功,ping 将显示相应的主机名。 |
/n <count> |
指定要发送的回显请求消息数。 默认值为 4。 |
/l <size> |
指定回显请求消息中 “数据” 字段的长度(以字节为单位)。 默认值为 32。 最大大小为 65,527。 |
/f | 指定发送回显请求消息时,IP 标头中的”不要片段”标志设置为 1 (仅在 IPv4 上) 。 目标路径中的路由器无法对回显请求消息进行分段。 此参数可用于排查 PMTU 问题 (的最大传输) 路径。 |
/I <TTL> |
指定发送的回显请求 (IP 标头) “生存时间”字段的值。 默认值是主机的默认 TTL 值。 最大 TTL 为 255。 |
/v <TOS> |
指定 IP 标头中”服务类型” (TOS) 字段的值,用于发送仅在 IPv4 上 (的回显请求) 。 默认值为 0。 TOS 指定为 0 到 255 的十进制值。 |
/r <count> |
指定 IP 标头 中的 “记录路由”选项用于记录回显请求消息和相应的回显答复消息 (仅在 IPv4 上) 。 路径中的每个跃点都使用”记录路由 “选项中的 一个条目。 如果可能,请 指定一 个计数,该计数等于或大于源和目标之间的跃点数。 计数 必须 最小为 1,最大值为 9。 |
/s <count> |
指定 IP 标头 中的 Internet 时间戳 选项用于记录回显请求消息和每个跃点的相应回显答复消息的到达时间。 计数 必须 最小为 1,最大值为 4。 链接本地目标地址需要此地址。 |
/j <hostlist> |
指定回显请求消息使用 IP 标头中的“松散源路由”选项,以及主机列表中指定的一组中间目标 ( 仅在 IPv4 上) 。 使用松散的源路由,连续的中间目标可以通过一个或多个路由器分隔。 主机列表中的地址或名称的最大数目为 9。 主机列表是一系列 IP 地址, (点十进制表示法) 空格分隔。 |
/k <hostlist> |
指定回显请求消息使用 IP 标头中的”严格源路由”选项,以及主机列表中指定的一组中间目标 ( 仅在 IPv4 上) 。 使用严格的源路由时,下一个中间目标必须可直接访问 (并且它必须是路由器接口接口上) 。 主机列表中的地址或名称的最大数目为 9。 主机列表是一系列 IP 地址, (点十进制表示法) 空格分隔。 |
/w <timeout> |
指定等待与给定回显请求消息相对应的回显答复消息的时间(以毫秒为单位)。 如果回显回复消息未在时间范围内收到,则会显示”请求已过”错误消息。 默认超过 4000 秒 (4 秒) 。 |
/R | 指定跟踪仅在 IPv6 (可用的往返) 。 |
/S <Srcaddr> |
指定仅在 IPv6 (可用的源地址) 。 |
/4 | 指定用于 ping 的 IPv4。 使用 IPv4 地址标识目标主机不需要此参数。 只需按名称标识目标主机。 |
/6 | 指定用于 ping 的 IPv6。 使用 IPv6 地址标识目标主机不需要此参数。 只需按名称标识目标主机。 |
<targetname> |
指定目标主机名或 IP 地址。 |
/? | 在命令提示符下显示帮助。 |
tracert [/d] [/h <maximumhops>] [/j <hostlist>] [/w <timeout>] [/R] [/S <srcaddr>] [/4][/6] <targetname>
参数 | 说明 |
---|---|
/d | 停止尝试将中间路由器的 IP 地址解析为其名称。 这可加快结果的返回速度。 |
/h <maximumhops> |
指定路径中要搜索目标目标的最大跃 (数) 。 默认值为 30 跃点。 |
/j <hostlist> |
指定回显请求消息将 IP 标头中的”松散源路由”选项与 中指定的中间目标集一起使用 <hostlist> 。 使用松散的源路由,连续的中间目标可以通过一个或多个路由器分隔。 列表中的地址或名称的最大数目为 9。 是 <hostlist> 一系列 IP 地址, (点十进制表示法) 空格分隔。 仅在跟踪 IPv4 地址时使用此参数。 |
/w <timeout> |
指定等待 ICMP 时间超出或回显答复消息所等待的时间(以毫秒为单位),该消息对应于要接收的给定回显请求消息。 如果在时间范围内未收到,则会显示 () * 星号。 默认超过 4000 秒 (4 秒) 。 |
/R | 指定 IPv6 路由扩展标头用于将回显请求消息发送到本地主机,使用目标作为中间目标并测试反向路由。 |
/S <srcaddr> |
指定要用于回显请求消息的源地址。 仅在跟踪 IPv6 地址时使用此参数。 |
/4 | 指定tracert.exe只能对此跟踪使用 IPv4。 |
/6 | 指定tracert.exe只能对此跟踪使用 IPv6。 |
<targetname> |
指定目标,由 IP 地址或主机名标识。 |
/? | 在命令提示符下显示帮助。 |
TCP 运输层
Transmission Control Protocol 是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
端口
16位 2字节
三次握手🫱🏻🫲🏼
-
主机A发出SYN包, 序号为A, 并进入 $SYN - SENT$ 状态 (主机B此时处于$LISTEN$状态)
- 主机B收到主机A的SYN报文后, 将包放入SYN队列, 回复一个 SYN/ACK 确认包, 确认号为A+1(收到A+1之前的报文) 序号为B 主机B进入SYN-RECEIVED状态
- 主机A收到报文, 发送一个ACK报文给主机B, 序号为A+1 确认号为B+1, A进入$ESTABLISHED$状态, 主机B收到ACK报文后也进入$ESTABLISHED$状态
四次挥手 👋🏻
- 主机A发送一个 FIN报文, 进入 $FIN-WAIT-1$ 状态
- 主机B收到FIN报文后, 回复一个ACK报文, 进入$CLOSE-WAIT$状态, 主机A收到ACK报文后进入$FIN-WAIT-2$状态
- 主机B发完数据后, 向主机A发送一个FIN 报文, 且 该报文的确认号与前ACK报文的确认号一致, 主机B进入$LAST-ACK$状态
- 主机A收到FIN报文后, 向主机B发送一个ACK报文, 主机A进入$TIME-WAIT$状态, 主机B收到主机A的ACK报文后也进入$CLOSED$状态
++ TCP 异常处理
这里提一下,当客户端收到第二次挥手,也就是收到服务端发送的 ACK 报文后,客户端就会处于 FIN_WAIT2
状态,在这个状态需要等服务端发送第三次挥手,也就是服务端的 FIN 报文。
对于 close 函数关闭的连接,由于无法再发送和接收数据,所以FIN_WAIT2
状态不可以持续太久,而 tcp_fin_timeout
控制了这个状态下连接的持续时长,默认值是 60 秒。
这意味着对于调用 close 关闭的连接,如果在 60 秒后还没有收到 FIN 报文,客户端(主动关闭方)的连接就会直接关闭。
长度分析
TCP报文的最大长度
TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层
{IP包{TCP或UDP包{Data}}}
-
链路层
以太网的最大长度为1500字节 MTU(Maximum Transmission Unit)
-
网络层
IP数据报首部20B min 1500 - 20 = 1480 B
-
传输层
UDP报文首部 8B 1472B
TCP报文首部 20B 1460B
网络命令
netstat [-a] [-b] [-e] [-n] [-o] [-p <Protocol>] [-r] [-s] [<interval>]
参数 | 说明 |
---|---|
-a | 显示计算机正在侦听的所有活动 TCP 连接以及 TCP 和 UDP 端口。 |
-b | 显示创建每个连接或侦听端口所涉及的可执行文件。 在某些情况下,已知可执行文件托管多个独立组件,在这些情况下,将显示创建连接或侦听端口所涉及的组件序列。 在这种情况下,可执行文件名称位于底部的 [] 中,顶部是它调用的组件,以此类推,直到达到 TCP/IP。 请注意,此选项可能很耗时,除非有足够的权限,否则将失败。 |
-E | 显示以太网统计信息,例如发送和接收的字节数和数据包数。 此参数可以与 -s 结合使用。 |
-n | 但是,显示活动的 TCP 连接,地址和端口号以数字表示,并且不会尝试确定名称。 |
-o | 显示活动的 TCP 连接,并包括每个 (PID) 的进程 ID。 可以在”进程”选项卡上找到基于 PID 的应用程序Windows 任务管理器。 此参数可以与 -a、 -n 和 -p 结合使用。 |
-p <Protocol> |
显示协议指定的协议 的连接。 在这种情况下, 协议可以是 tcp 、udp、tcpv6 或 udpv6。 如果此参数与 -s 一起用于按协议显示统计信息,则协议可以是 tcp、udp、icmp、ip、tcpv6、udpv6、icmpv6 或 ipv6。 |
-S | 按协议显示统计信息。 默认情况下,会显示 TCP、UDP、ICMP 和 IP 协议的统计信息。 如果安装了 IPv6 协议,则会显示基于 IPv6 的 TCP、基于 IPv6 的 UDP、ICMPv6 和 IPv6 协议的统计信息。 -p 参数可用于指定一组协议。 |
-r | 显示 IP 路由表的内容。 这等效于 route print 命令。 |
<interval> |
每隔间隔秒重新显示 所选 信息。 按 CTRL+C 停止重新播放。 如果省略此参数,则此命令仅打印所选信息一次。 |
/? | 在命令提示符下显示帮助。 |
TCP 有限状态机
FTP 应用层
文件传输协议(File Transfer Protocol,缩写:FTP)是一个用于在计算机网络上在客户端和服务器之间进行文件传输的应用层协议。
FTP协议的目标
-
促进文件的共享(计算机程序或数据)
-
鼓励间接或者隐式的使用远程计算机
-
向用户屏蔽不同主机中各种文件存储系统(File system)的细节
-
可靠和高效的传输数据
FTP命令
FTP应答
响应码 | 信息 |
---|---|
150 | 打开连接 |
200 | 成功 |
211 | 系统状态回复 |
213 | 文件状态回复 |
227 | 进入被动模式(IP, port) |
421 | 服务关闭 |
450 | 文件不可用 |
452 | 磁盘空间不足 |
500 | 无效命令 |
501 | 错误参数 |
550 | 文件不可用 |
控制连接21 & 数据连接20
主动模式和被动模式
主动模式PORT要求客户端和服务器端同时打开并且监听一个端口以创建连接。在这种情况下,客户端由于安装了防火墙会产生一些问题。客户端发送一个端口给服务器
被动模式PASV 只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题
服务器发送端口给客户端
port计算方法: $n5 \times 256 + n6$
安全性
明文口令 –> 使用密文传输用户名和口令
数据劫持
SSL + FTP = FTPS
客户端必须先使用TLS Client Hello消息向FTPS服务器进行握手来创建加密连接。如果FTPS服务器未收到此类消息,则服务器应断开连接。
HTTP 应用层
超文本传输协议(HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议
尽管TCP/IP协议是互联网上最流行的应用,但是在HTTP协议中并没有规定它必须使用或它支持的层。事实上HTTP可以在任何互联网协议或其他网络上实现。
请求方法
- GET —— 向指定的资源发出“显示”请求。
- HEAD —— 与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。
- POST —— 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
- CONNECT —— HTTP/1.1协议中预留给能够将连接改为隧道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
报文格式
HTTP首部
通用首部字段
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connextion | 逐跳首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
请求首部字段
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言 |
Host | 指定资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与If-Match相反) |
Referer | 对请求中URI的原始获取方 |
User-Agent | Http客户端程序的信息 |
响应首部字段
首部字段名 | 说明 |
---|---|
Accept-Range | 是否接受字节范围请求 |
ETag | 资源的匹配信息 |
Location | 另客户端重定向至指定URI |
Server | Http服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
实体首部字段
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的Http方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(字节) |
Content-Location | 替代对应资源的URI |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
响应码
**
状态类型 | 信息 |
---|---|
1xx | 指示信息–表示请求已接收,继续处理。 |
2xx | 成功–表示请求已被成功接收、理解、接受。 |
3xx | 重定向–要完成请求必须进行更进一步的操作。 |
4xx | 客户端错误–请求有语法错误或请求无法实现。 |
5xx | 服务器端错误–服务器未能实现合法的请求。 |
常见状态码 | |
---|---|
200 OK | 客户端请求成功 |
400 Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
401 Unauthorized | 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 |
403 Forbidden | 服务器收到请求,但是拒绝提供服务 |
404 Not Found | 请求资源不存在,举个例子:输入了错误的URL |
500 Internal Server Error | 服务器发生不可预期的错误 |
503 Server Unavailable | 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
期中真题
- 该数据包是什么协议的数据包?该协议的作用是?
- 试阐述该数据代表协议中的什么命令,并解释其作用,最后对 Line-based text data 中的内容进行分析。
- 在该数据包后,连接会立刻断开吗?试解释原因。
- 试分析产生该数据包的计算机平台信息。
-
针对该数据包的 Accept、Accept-Language、Content-Type、Accept-Encoding 字段,分析 其作用。
-
该数据包是HTTP协议数据包 HTTP协议即超文本传输协议,用于传输超文本文件等
-
该数据包是HTTP中的POST命令,用于向目标主机发送POST请求,传输信息 Line-based text data 中 application/x-www-form-urlencoded 来自报文中的
Content-Type字段,即内容类型,表示内容为应用数据 后面的 DDDDD=test&upass=test&OMKKEY=%B5%C7%C2%BC+login 为传输的应用 数据,推测该数据用于网页账号登录
-
连接不会立即断开,以为报文Connection字段属性为Keep-Alive,所以会保持一 段时间的连接
-
通过对报文的分析,只能得知计算机平台使用的浏览器内核为Mozill,使用的语 言可能是中文
- Accept:主机接收的类型-接收gif, jpeg, pjpeg等类型的数据 Accept-Language: 接收中文的超文本信息 Content-Type: 该POST报文的内容类型 Accept-Encoding: 数据的编码协议,用于压缩数据大小,节省网络资源
网络编程 !!
.NET
IPAddress
IPEndPoint
public class IPEndPoint : System.Net.EndPoint
//Creates an IpEndPoint.
IPAddress ipAddress = Dns.Resolve("www.contoso.com").AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 11000);
//Serializes the IPEndPoint.
SocketAddress socketAddress = ipLocalEndPoint.Serialize();
//Verifies that ipLocalEndPoint is now serialized by printing its contents.
Console.WriteLine("Contents of the socketAddress are: " + socketAddress.ToString());
//Checks the Family property.
Console.WriteLine("The address family of the socketAddress is: " + socketAddress.Family.ToString());
//Checks the underlying buffer size.
Console.WriteLine("The size of the underlying buffer is: " + socketAddress.Size.ToString());
//Deserialize.
IPEndPoint clonedIPEndPoint = (IPEndPoint)endpoint.Create(socketAddress);
AddressList属性:获取或设置与主机相关的IP地址。其值为IPAddress类型的数组 ,其中包含的IP地址用于解析Aliases属性中的主机名。
HostName属性:获取或设置主机的DNS名。包含服务器的基础主机名,如果服 务器的DNS项定义了附加别名,则可通过Aliases属性使用它们。
IPEndPoint类以IP地址和端口号的形式代表一个网络终端。该类中包含应用程序 连接到主机服务时需要的主机和端口信息,通过组合主机的IP地址和端口号构成 服务的一个连接点。 IPEndPoint类的属性和方法如下表所示。
属性、方法名 | 说明 |
---|---|
Address | 获取或设置EndPoint的IP地址 |
AddressFamily | 获取IP地址族 |
Port | 获取或设置EndPoint的TCP端口号 |
MaxPort | 用于指定可被赋予Port属性的最大值(只读) |
MinPort | 用于指定可被赋予Port属性的最小值(只读) |
Create( ) | 调用Creat( )方法,以根据套接字地址创建EndPoint |
Serialize( ) | 调用Serialize( )方法,以将EndPoint信息序列化到一个SocketAddress实例中 |
Socket
Method | Info |
---|---|
Bind(EndPoint address) | 需要将它绑定到系统的一个特定地址 。可以使用Bind( )方法来完成,其参数为一个IPEndPoint实例(包含IP地址和端 口信息)。 |
Listen(int con_num) | 其参数con_num为一整型值,该值表示服务器可以接受的最大连接 数目 |
Accept( ) | 服务器将使用 |
Send( ) | Accept( )方法来接受连接请求服务器和客户端双方就可以利用 Send( )方法来发送数据 |
Receive( ) | 利用 Receive( )方法来接受数据 |
Shutdown(SocketShutdown how) | 当客户端和服务器端的通信结束时,必须关闭相应的套接字实例 |
Close( ) | 关闭套接字连接并释放 |
TCPClient & TCPListener
TcpClient类为TCP网络服务提供客户端连接,它构建于Socket类之上,以
提供较高级别的TCP服务,即提供了通过网络连接、发送和接收数据的简单方 法。用于在同步阻止模式下通过网络来连接、发送和接收流数据。另外,通 过与NetworkStream对象的关联,使得用户可以通过流操作方式实现对网络连
接状态下数据的发送和接收。
属性 | 描述 |
---|---|
Available | 获取网络接收缓冲区中可供读取的数据量 |
Client | 获取或设置基础Socket |
Connected | 标识TcpClient的基础Socket是否已连接到远程主机 |
NoDelay | 指定在发送或接收缓冲区未满时,套接字是否将延迟发送或接收数据 |
ReceiveBufferSize | 获取或设置接收缓冲区的大小 |
ReceiveTimeout | 获取或设置在初始化一个读取操作以后 TcpClient 等待接收数据的时间量 |
SendBufferSize | 获取或设置发送缓冲区的大小 |
SendTimeout | 获取或设置 TcpClient 等待发送操作成功完成的时间量 |
TcpClient | 构造函数 |
BeginConnect | 开始一个对远程主机连接的异步请求 |
Close | 释放TcpClient 实例,而不关闭基础连接 |
Connect | 依据指定的主机名和端口号连接到TCP主机 |
EndConnect | 异步接受传入的连接尝试 |
GetStream | 返回用于发送和接收数据的NetworkStream实例 |
TcpClient类实现了客户端编程抽象,因此构建客户端网络应用程序便可
以直接使用TcpClient取代Socket,更加方便易用。同样,对于服务器端应 用程序的构建,C#提供了TcpListener类。该类也是构建于Socket之上,提 供了更高抽象级别的TCP服务,使得程序员能更方便地编写服务器端应用 程序。
名称 | 描述 |
---|---|
ExclusiveAddres sUse | 获取或设置一个布尔值,以指定当前TcpListener是否只允许一个基础 套接字来侦听特定端口 |
LocalEndpoint | 获取当前TcpListener的基础IPEndPoint实例,此对象包含关于本地网络 接口的IP地址和端口号信息 |
Active | 指明TcpListener是否正在侦听连接请求(受保护方法) |
Server | 获取基础网络Socket实例 |
AcceptSocket | 接受挂起的连接请求,并返回一个Socket实例用来与客户进行通信 |
AcceptTcpClient | 接受挂起的连接请求,并返回一个TcpClient实例用来与客户进行通信 |
BeginAcceptSocket | 开始一个异步操作来接受一个传入的连接尝试 |
BeginAcceptTcpClient | 开始一个异步操作来接受一个传入的连接尝试 |
EndAcceptSocket | 异步接受传入的连接尝试,并创建新的Socket来处理远程主机通信 |
EndAcceptTcpClient | 异步接受传入的连接尝试,并创建新的TcpClient来处理远程主机通信 |
Pending | 确定是否有挂起的连接请求 |
Start | 开始侦听客户端的连接请求 |
Stop | 关闭侦听器 |
StreamReader & NetworkStream
StreamReader rs = new StreamReader(m_clientsocket.GetStream( ));
NetworkStream ws = m_clientsocket.GetStream( );
// Send data
ws.Write(data, 0, data.Length);
//Reader Data
rs.ReadLine() ;
Thread
TcpClient m_client = m_Listener.AcceptTcpClient();
ClientHandle m_handle = new ClientHandle();
m_handle.ClientSocket = m_client;
Thread m_clientthread = new Thread(new ThreadStart(m_handle.ResponseClient));
// ThreadStart(func())
m_clientthread.Start();
// Thread.Start()
HTTP Server with Socket
while(true){
try{ socketClient=socketServer.Accept( );
... //使线程和每一个HTTP客户端连接 Thread ThreadClient=new Thread(new ThreadStart(this.ProcessRequest)); ThreadClient.Start( ); }
catch(Exception ex) { if(socketClient.Connected)
socketClient.close( ); }
if (File.Exists(sPhysicalFilePath) == false)
{
sErrorMessage = "<H2>404 Error! File Does Not Exists...</H2>";
SendHeader(sHttpVersion, "", sErrorMessage.Length, " 404 Not Found", ref mySocket);
SendToBrowser(sErrorMessage, ref mySocket);
Console.WriteLine(sFormattedMessage);
}
else
{
int iTotBytes = 0;
sResponse = "";
FileStream fs = new FileStream(sPhysicalFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryReader reader = new BinaryReader(fs);
byte[] bytes = new byte[fs.Length];
int read;
while ((read = reader.Read(bytes, 0, bytes.Length)) != 0)
{
sResponse = sResponse + Encoding.ASCII.GetString(bytes, 0, read);
iTotBytes = iTotBytes + read;
}
reader.Close();
fs.Close();
SendHeader(sHttpVersion, sMimeType, iTotBytes, " 200 OK", ref mySocket);
SendToBrowser(bytes, ref mySocket);
}
Windows 网络命令
ARP
arp [/a [<inetaddr>] [/n <ifaceaddr>]] [/g [<inetaddr>] [-n <ifaceaddr>]] [/d <inetaddr> [<ifaceaddr>]] [/s <inetaddr> <etheraddr> [<ifaceaddr>]]
参数 | 说明 |
---|---|
[/a [<inetaddr>] [/n <ifaceaddr>] |
显示所有接口的当前 arp 缓存表。 /n 参数区分大小写。 若要显示特定 IP 地址的 arp 缓存条目,请对 inetaddr 参数使用 arp /a,其中 inetaddr 是 IP 地址。 如果 未指定 inetaddr ,则使用第一个适用的接口。 若要显示特定接口的 arp 缓存表,请结合使用 /n ifaceaddr 参数和 /a 参数,其中 inetaddr 是分配给接口的 IP 地址。 |
[/g [<inetaddr>] [/n <ifaceaddr>] |
与 /a 相同。 |
[/d <inetaddr> [<ifaceaddr>] |
删除具有特定 IP 地址的条目,其中 inetaddr 是 IP 地址。 若要删除表中特定接口的条目,请使用 ifaceaddr 参数,其中 ifaceaddr 是分配给接口的 IP 地址。 若要删除所有条目,请使用星号 (*) 通配符来表示 inetaddr。 |
[/s <inetaddr> <etheraddr> [<ifaceaddr>] |
将静态条目添加到 arp 缓存,将 IP 地址 inetaddr 解析为物理地址 etheraddr。 若要为特定接口将静态 arp 缓存条目添加到表中,请使用 ifaceaddr 参数,其中 ifaceaddr 是分配给接口的 IP 地址。 |
/? | 在命令提示符下显示帮助。 |
a - all
d - delete
s - static
ROUTE
route [/f] [/p] [<Command> [<Destination>] [mask <Netmask>] [<Gateway>] [metric <Metric>]] [if <Interface>]]
PING
ping & tracert
ping [/t] [/a] [/n <count>] [/l <size>] [/f] [/I <TTL>] [/v <TOS>] [/r <count>] [/s <count>] [{/j <hostlist> | /k <hostlist>}] [/w <timeout>] [/R] [/S <Srcaddr>] [/4] [/6] <targetname>
参数 | 说明 |
---|---|
/t | 指定 ping 继续向目标发送回显请求消息,直到中断。 若要中断并显示统计信息,请按 CTRL+ENTER。 若要中断并退出此命令,请按 CTRL+C。 |
/a | 指定对目标 IP 地址执行反向名称解析。 如果此操作成功,ping 将显示相应的主机名。 |
/n <count> |
指定要发送的回显请求消息数。 默认值为 4。 |
/l <size> |
指定回显请求消息中 “数据” 字段的长度(以字节为单位)。 默认值为 32。 最大大小为 65,527。 |
/f | 指定发送回显请求消息时,IP 标头中的”不要片段”标志设置为 1 (仅在 IPv4 上) 。 目标路径中的路由器无法对回显请求消息进行分段。 此参数可用于排查 PMTU 问题 (的最大传输) 路径。 |
/i <TTL> |
指定发送的回显请求 (IP 标头) “生存时间”字段的值。 默认值是主机的默认 TTL 值。 最大 TTL 为 255。 |
/v <TOS> |
指定 IP 标头中”服务类型” (TOS) 字段的值,用于发送仅在 IPv4 上 (的回显请求) 。 默认值为 0。 TOS 指定为 0 到 255 的十进制值。 |
/r <count> |
指定 IP 标头 中的 “记录路由”选项用于记录回显请求消息和相应的回显答复消息 (仅在 IPv4 上) 。 路径中的每个跃点都使用”记录路由 “选项中的 一个条目。 如果可能,请 指定一 个计数,该计数等于或大于源和目标之间的跃点数。 计数 必须 最小为 1,最大值为 9。 |
/s <count> |
指定 IP 标头 中的 Internet 时间戳 选项用于记录回显请求消息和每个跃点的相应回显答复消息的到达时间。 计数 必须 最小为 1,最大值为 4。 链接本地目标地址需要此地址。 |
/j <hostlist> |
指定回显请求消息使用 IP 标头中的“松散源路由”选项,以及主机列表中指定的一组中间目标 ( 仅在 IPv4 上) 。 使用松散的源路由,连续的中间目标可以通过一个或多个路由器分隔。 主机列表中的地址或名称的最大数目为 9。 主机列表是一系列 IP 地址, (点十进制表示法) 空格分隔。 |
/k <hostlist> |
指定回显请求消息使用 IP 标头中的”严格源路由”选项,以及主机列表中指定的一组中间目标 ( 仅在 IPv4 上) 。 使用严格的源路由时,下一个中间目标必须可直接访问 (并且它必须是路由器接口接口上) 。 主机列表中的地址或名称的最大数目为 9。 主机列表是一系列 IP 地址, (点十进制表示法) 空格分隔。 |
/w <timeout> |
指定等待与给定回显请求消息相对应的回显答复消息的时间(以毫秒为单位)。 如果回显回复消息未在时间范围内收到,则会显示”请求已过”错误消息。 默认超过 4000 秒 (4 秒) 。 |
/R | 指定跟踪仅在 IPv6 (可用的往返) 。 |
/S <Srcaddr> |
指定仅在 IPv6 (可用的源地址) 。 |
/4 | 指定用于 ping 的 IPv4。 使用 IPv4 地址标识目标主机不需要此参数。 只需按名称标识目标主机。 |
/6 | 指定用于 ping 的 IPv6。 使用 IPv6 地址标识目标主机不需要此参数。 只需按名称标识目标主机。 |
<targetname> |
指定目标主机名或 IP 地址。 |
/? | 在命令提示符下显示帮助。 |
tracert [/d] [/h <maximumhops>] [/j <hostlist>] [/w <timeout>] [/R] [/S <srcaddr>] [/4][/6] <targetname>
参数 | 说明 |
---|---|
/d | 停止尝试将中间路由器的 IP 地址解析为其名称。 这可加快结果的返回速度。 |
/h <maximumhops> |
指定路径中要搜索目标目标的最大跃 (数) 。 默认值为 30 跃点。 |
/j <hostlist> |
指定回显请求消息将 IP 标头中的”松散源路由”选项与 中指定的中间目标集一起使用 <hostlist> 。 使用松散的源路由,连续的中间目标可以通过一个或多个路由器分隔。 列表中的地址或名称的最大数目为 9。 是 <hostlist> 一系列 IP 地址, (点十进制表示法) 空格分隔。 仅在跟踪 IPv4 地址时使用此参数。 |
/w <timeout> |
指定等待 ICMP 时间超出或回显答复消息所等待的时间(以毫秒为单位),该消息对应于要接收的给定回显请求消息。 如果在时间范围内未收到,则会显示 () * 星号。 默认超过 4000 秒 (4 秒) 。 |
/R | 指定 IPv6 路由扩展标头用于将回显请求消息发送到本地主机,使用目标作为中间目标并测试反向路由。 |
/S <srcaddr> |
指定要用于回显请求消息的源地址。 仅在跟踪 IPv6 地址时使用此参数。 |
/4 | 指定tracert.exe只能对此跟踪使用 IPv4。 |
/6 | 指定tracert.exe只能对此跟踪使用 IPv6。 |
<targetname> |
指定目标,由 IP 地址或主机名标识。 |
/? | 在命令提示符下显示帮助。 |