4.2 Virtual Circuit and Datagram Networks
VC
- Set up connection
- Exchange data
- Free the connection
- The connection is a virtual circuit containing not only the two hosts but also many routers
Datagram
- No connections.Just send datagram directly
- Router uses Longest Prefix Matching Rule
- Packets may arrive out of order(They may have different paths)
- Forwarding table in routers is updated slowly.
- The Network-Layer will become simple as Datagram Network.
注:
我感觉得到在纸上做笔记效率较低,而且通过扫描成图片的方式发在博客上不利于分享交流,也不利于转化成其他形式的文件备份或者打印。因此,我在逐渐尝试着间接或者直接的在电脑上做笔记,或者总结。也是为了未来着想。
之后的截图均来自《计算机网络自顶向下方法》第六版,这里为方便自己及其他朋友理解方便而放置,请勿用作商业用途。
4.3 What's Inside a Router?
Focus on forwarding function
Note:
- The word port below refers to physical port different from software port if no special prompt is given.
Components:
-
Input ports
- terminating an incoming physical link at a router
- interoperate with link layer at the other side of the incoming link
- lookup function: use forwarding table to determine router output port to which an arriving packet will be forwarded via switching fabric.(Most crucial)
-
Switching fabric
- switch via memory
- switch via a bus
- switch via an interconnection network
- Output ports
Routing processor
-
Queueing may occur (So packets may loss or drop)
- Output port queuing广播地址
- HOL blocking at an input queued switch
注:学习要把握好一个平衡度。我对于安全领域强调实战的观点,但是亦不可轻视理论的作用。当然,读书不可死记硬背。网络的水太深,想把书读一遍就记住显然不现实也没必要。姑且读他一遍,权当入门了解,以后用到什么再学什么。另外还有Stevens先生的经典,TCP/IP三卷,网络编程两卷。在那些实践的书籍上多下功夫!理论-->实践 实践-->理论 循环往复,不断尝试,不断出错,不断积累。
4.4 The Internet Protocol (IP): Forwarding and Addressing in the Internet
前注:
看自己之前在纸上做的笔记还是有些感慨的。因为传输层这一章比较难于理解,况且读的还是英文版原著。在纸上亲自把那些协议的状态机模型画一遍抄一遍后,我才慢慢开始理解。纸上做笔记还是有独特优点的,可以帮助我理清思路。本来打算一天看一节的,不过由于4.4节内容过多,且今天恰逢周末,就多看一些。本来自己起步晚,而且又有兴趣,是应该更加努力的。
In this section the author shares with us a precious picture:
I like this way to teach or learn something!
4.4.1 Datagram Format
IPv4 datagram structure:
注:初学时我总是会被这种结构化的报文段或数据包段搞糊涂,感觉数据怎么可能是这种二维的。其实就是一个长长的比特流,由于其中的字段的确分化的十分整齐(32bit字),并且在C里边是以结构体的方式实现,所以就这么表达这个IP报文的概念了,多形象。
为了在实践中理解,这里放上一个wireshark的截图,可以和上面那张搭配着看(更推荐自己动手捕获几个包研究一下):
跟TCP/UDP header对比着研究,发现在不带options时IPv4的报文头和TCP头部均为5个32-bit字即 20 bytes,UDP为 8 bytes。有意思的是,IPv4头只关注IP地址不关注端口,TCP/UDP头只关注端口不关注IP,很好体现了分层(分而治之)的思想。
另外注意,IPv4报头的Header length 单位同TCP段头的Header length一样,都是32-bit字,也就是说它只要写个5就代表20bytes。而UDP头没有Header length,只有一个 header+data 的总长度length,它和IPv4头中的Datagram length单位一样,都是byte,不是 4 bytes。
- Time-to-live (TTL):
This field is decremented by one each time the datagram is processed by a router. If TTL is 0, this datagram will be dropped.
- Upper-layer Protocol:
Used when the datagram reaches final destination. 6 means TCP, 17 means UDP.
下面是书中特别精辟的两句话:
The protocol number is the glue that binds the network and transport layers together.
The port number is the glue that binds the transport and application layers together.
另外书上说到第五章会遇到一个链路层的项可以把链路层和网络层联系起来。到时候回过头来补上。
-
Header checksum:
- 计算方法:将header中每2bytes为一组,连续求和,结果放在checksum field
- Router 会计算并与checksum field 的数字比对,如果不一致则丢弃datagram
- 每到一个router,checksum会重新计算并储存一次
- 注意:IPv4 datagramchecksum只计算header部分,TCP/UDP checksum会计算整个segment
- 为什么链路层和网络层都要计算一次checksum?上面一点是一个原因,另外要知道链路层上面不一定就是TCP/UDP,还可能是其他协议(如ATM)
Src/Dst IP addresses:
通常src host会进行DNS查询得到dst IP。
- Options:
Options会引入长度多样性和复杂性,在IPv6头中已经被弃用。
- Data(Payload):
payload这个词真是亲切啊(metasploit....)
: )
其实这个段还可以带TCP/UDP之外的内容,如ICMP messages.
-
IP Datagram Fragmentaion
- 链路层帧可携带的最大数据量称MTU,以太网帧MTU可达1500bytes,而其他方式的MTU可能很小
- src到dst的路途中可能会经过不同的链路层协议,即经过不同的MTU值
- 如果router's outgoing link的MTU小于之前的,那么就要对IP datagram fragment
- 为了保证网络核心的简单化,网络协议设计者把报文分割的任务放在了终端系统而非路由器上(可以与之前的知识联合起来了,一个TCP段的长度不可以超过MTU值),但是由于链路层可能异构,router应该还是需要具备fragment能力的
- 为了让接受者能够重组收到的fragments,IPv4引入了上图中的identification,flag and fragmentation offset
- identification判断是不是同一个data segment的sub datagram
- flag判断是不是最后一个sub datagram (最后一个包的flag=0,其余为1)
- offset判断同一个id不同datagram的顺序(offset以8bytes块为单位)
附图:
(上图中刚开始的datagram真是长的可以......4000bytes !)
注意,假如丢包了,要和第三章学的网络层联系起来。如果是TCP,可能不会完全丢掉已经接收的fragments,而是对缺失的包要求重传。
- Fragmentation 可能引起DoS攻击。可搜索IP碎片攻击(主要问题似乎出在target主机的重组算法上)
- ping o‘ death
- jolt2
- teardrop
本书提供fragment体验的资源,感兴趣的可以尝试一下: applet
效果如下图:
4.4.2 IPv4 Addressing
IP 地址是与网卡(interface)绑定的,而非一个host或router(一个host也可能有多个网卡)
书上经典的图好多,这里又是一张:
在上图中,单就左侧223.1.1.xxx来说,是不需要router的,只需要一个Ethernet switch或者一个Wireless access point,它可以称作一个subnet,网络地址为223.1.1.0/24 (/24代表子网掩码从左往右数有24个1,即255.255.255.0)
另外:
上图中各个路由器之间也可以构成subnet(个人感觉只要他们的IP可以用一个xxx.xxx.xxx.0/xx表示都可以称作subnet : ))所以上图中有6个subnet
IP地址分配方法:Classless Interdomain Routing (无类域间路由CIDR)
大概就是a.b.c.d/x这种子网划分的方法吧,等于说ISP只需要把a.b.c.d/x这个东西给上层路由交上去,减少了上层router的负担。(分而治之的思想)
下图是更加形象的描述:
假如很不幸,Organization 1 连到了上图中的 ISPs-R-Us 上,那么它需要保持它的IP不变,让 ISPs-R-Us 对外如下图这样宣布:
根据最长地址前缀匹配原则,外界会把发给 Organization 1 的数据发给 ISPs-R-Us
根据同样的道理,a.b.c.d/x可以继续往下划分 subnet 如 a.b.c.d/y,只要 y>x 即可
在CIDR之前,IP使用ABCDE分类.....(感兴趣自行google,推荐慕课网Tony老师的课)
注意,255结尾的是broadcast地址(如255.255.255.255 注意广播地址也有分类,具体可google,简单来说一般子网中主机字段均为1的都是广播地址),0结尾的是网络地址
讲了这么多IP地址的东西,那么一个 host 或者一个 organization 是如何获得一个IP address 的呢?
- Obtaining a Block of Addresses
如上图,一个ISP可以把它用有的IP地址按照CIDR的方式分配。
所有的IP最终由ICANN管理(该机构同时管理DNS root servers),之后一层一层向下分配IP段(地址)
- Obtaining a Host Address: the Dynamic Host Configuration Protocol
哈哈,DHCP......强烈建议所有搞渗透测试的在进入内网前配置开启DHCP服务 ~~~(玩笑归玩笑啊,基本素养还是要有的)
DHCP是一种 plug-and-play protocol (即插即用 PNP)
现在大多数无线路由器都自动集成了DHCP功能(router本身可能是从ISP 的DHCP server处获得IP)
DHCP分配一个IP有4步(请问把大象装冰箱里分几步?):
找到DHCP server (client 发送 src IP=0.0.0.0, dst IP=255.255.255.255, port=67 UDP包,链路层把这个帧向子网中所有主机广播)(所以渗透的时候别暴露自己了......)
DHCP server回复 (也是广播的方式,一个subnet上可能有多个DHCP server)
DHCP request (client选择一个DHCP server)
DHCP ACK (那个被选中的server确认)
又是图:
注意上图中port号的差异。
- Network Address Translation (NAT)
要不是NAT,IP地址枯竭会更早一些。
我觉得NAT是CIDR的小型版本。只不过CIDR转换的是公网IP,NAT转换的是局域网IP罢了。
又是图!:
看上图,NAT功能相当于构造一个具有公网IP的virtual host,将局域网内主机与该位于公网的virtual host 进行端口映射
我越来越觉得网络层次之间的相似性,有一种递归的感觉。
ISP DHCP给router,router DHCP 给普通 host
CIDR 让某个较大的subnet对外显示一个 a.b.c.d/x (减轻网络中心router的负担) NAT 让一个小型的subnet(如wireless local area network)对外使用一个公网IP(缓解IP枯竭)
总之,通过这一种分而治之的递归的概念,网络的复杂性被降低了很多。
不过,NAT也有人反对。当然它也有缺点。诚然,IPv6会解决许多问题,但是IPv6不是还没有普及嘛。
- UPnP (Universal PnP)
感觉就是长久的端口绑定(感觉在IOT上会火 : ) )
4.4.3 Internet Control Message Protocol (ICMP)
ICMP 通常被认为是 IP 的一部分,但实际上ICMP messages是被装在IP datagrams中(同TCP/UDP)。
下面是一个ICMP头的格式(来自wiki):
type: ICMP type
code: ICMP subtype
ICMP 的data段包含了引起该ICMP消息的IP datagram头部和那个IP数据段的前 8 bytes
如 ping 发送一个 type 8 code 0 message 给目标,而目标则回应以 type 0 code 0 message
ICMP message通常用作源抑制(source quenth),即一个拥塞的router发ICMP给源告诉它减速,很少有实际的传输作用。
traceroute就是基于ICMP的。src发送一系列UDP segment,TTL分别为1,2,3......src在发送同时设置timer.当TTL=n的报文被第n跳的router收到,它发现这个报文过期,就丢弃该报文并返回一个ICMP警告消息(type 11 code 0)
由于src发送的ICMP报文中包含的UDP port是非法的,故当dst收到ICMP时会返回(type 3, code 3)给src。
可以研究firewall和IDS/IPS对于ICMP报文的过滤。
4.4.4 IPv6
前注:感觉把所有笔记记到一篇随笔里翻看起来不方便,所以等到打算从第五章开始重开一篇随笔。
为什么要用IPv6的原因和迟迟普及不了的原因可以自行Google。
IPv6 Datagram Format:
注意上图中:
头部已经变成了固定 40 bytes
为了方便对比,这里把IPv4的结构再发一次:
在IPv6中:
- traffic class 与 IPv4 中的 TOS field 功能差不多
- Flow label 用来标志报文流
- Payload length 记录报文头后面的data长度
- Next header 标识数据段所用协议(与 IPv4 中Protocol一样)
- Hop limit 相当于 TTL
相比之下,IPv6少了:
- fragmentation/reassembly (如果一个 datagram 过大,router会直接丢弃并返回ICMP错误消息)
- Header checksum (网络层已经有checksum了)
- Options
从 IPV4 向 IPv6 转换:
办法有很多,但是都不容易
1 dual-stack (双协议栈),让一些 IPv6 nodes 同时有一套 IPv4 协议栈 (它们可以与IPv4 nodes通信):
如上图,缺点是在不同协议之间切换时会造成某协议特有的字段丢失
2 Tunnel 这个想法真不错!把整个IPv6报文装在IPv4 data段传输(同样地,tunnel两端的router要具有双协议栈):
网络层协议更换要比应用层协议更换难的多!~
4.4.5 A Brief Foray into IP Security
早期网络是可信的,所以没有安全的需求,然而现在不一样了。
名词: IPsec
这个 IPsec 是网络层的一系列安全协议,它是面向连接的。可兼容 IPv4 / IPv6。(在第八章详细讲)
简单来说,包括以下几个方面:
- 密码协议
- 报文数据段加密
- 数据完整性检验
- 初始认证
4.5 Routing Algorithms
前注:先读书不写blog,之后整节读过后在回顾时再记录blog笔记。
另外,今天,2016-05-10 开了Modern OS的阅读。
虽千万虑,吾往矣。