#import "../../template.typ": *
#import "@preview/tablem:0.1.0": tablem


#show: project.with(
  title: "理论 6",
  authors: (
    "absolutex",
  )
)
// P3、P5、 P14、P15、 P21、P31

= 理论作业6

== P3 假设某分组的信息部分（图6.3中的D）包含10字节，它由字符 “Internet” 的8比特无符号二进制ASCII表示组成。对该数据计算因特网检验和。

```python
#! /usr/bin/env python3
s = sum(map(ord, "Internet"))  # =841
s = int(s / (1 << 8)) + s % (1 << 8)  # 进位 =76, 01001100
s = ~s  # 补码 =-77, 10110100
```

`checksum = 10110100`

== P5 考虑5比特生成多项式，G=10011，并且假设D的值为101010101010。R的值是什么?

```python
#! /usr/bin/env python3
G=0b10011
D=0b101010101010
r=5
(D << r )% G
# = 17
```

== P14.如图6-33所示，考虑通过两台路由器互联的3个局域网。

=== a.对所有的接口分配IP地址。对子网1使用形式为192.168.1.xxx的地址，对子网2使用形式为192.168.2.xxx 的地址，对子网3使用形式为192.168.3.xxx的地址。

#tablem[
  |主机|ip|
  |---|---|
  |A|192.168.1.2|
  |B|192.168.1.3|
  |C|192.168.2.2|
  |D|192.168.2.3|
  |E|192.168.3.2|
  |F|192.168.3.3|
  |左路由左侧接口|192.168.1.1|
  |左路由右侧接口|192.168.2.1|
  |右路由左侧接口|192.168.2.4|
  |右路由右侧接口|192.168.3.1|
]
#linebreak()

=== b.为所有的适配器分配 MAC 地址。

由于所有设备的MAC均不同且没有限制，因此直接使用 

*`MAC-A`...`MAC-F`, MAC-R1-左，MAC-R1-右，MAC-R2-左，MAC-R2-右*

来指代适配器 MAC 地址。

=== c.考虑从主机E向主机B发送一个IP数据报。假设所有的ARP 表都是最新的。就像在6.4.1节中对单路由器例子所做的那样，列举出所有步骤。

1. 主机E发送IP数据报，其中MAC地址指示了 MAC-R2-右。
2. 路由器R2收到IP数据报，查表发现子网地址在子网1内，需要通过接口 MAC-R1-右。
3. 路由器R2将IP数据报发给R1（MAC-R1-左）。
4. R1收到IP数据报，查表查到了 MAC-B，通过接口 MAC-R1-左 发出。


=== d.重复（c），现在假设在发送主机中的ARP 表为空(并且其他表都是最新的)。

1. 主机E发送IP数据报，其中MAC地址指示了 MAC-R2-右。
2. 路由器R2收到IP数据报，没发现MAC-B地址，因此广播ARP请求。
3. R1 收到ARP请求，发现自己有MAC-B，于是回应请求。
3. 路由器R2收到回应，将MAC-R1-右写入ARP表，并交出数据报。
4. R1收到IP数据报，查表查到了 MAC-B，通过接口 MAC-R1-左 发出。

== P15 考虑图6-33。现在我们用一台交换机S1代替子网1和子网2之间的路由器，并且将子网2和子网3之间的路由器标记为R1。


=== a.考虑从主机E向主机F发送一个IP 数据报。
+ 主机E将请求路由器R1帮助转发该数据报吗?为什么?

  不用。因为在一个子网中。

+ 在包含 IP数据报的以太网帧中，源和目的IP和MAC地址分别是什么?

  - 源IP：192.168.3.2
  - 目的IP：192.168.3.3
  - 源MAC：MAC-E
  - 目的MAC：MAC-F

=== b.假定E希望向B发送一个 IP 数据报，假设E的ARP缓存中不包含B的MAC地址。

+ E将执行ARP 查询来发现B的MAC 地址吗?为什么?

  会。因为不在同一子网且ARP缓存中没有B的MAC地址。

+ 在交付给路由器R1的以太网帧（包含发向B的IP数据报）中，源和目的IP和MAC地址分别是什么?

  - 源IP：192.168.3.2
  - 目的IP：192.168.1.3
  - 源MAC：MAC-E
  - 目的MAC：MAC-R2-右

=== c.假定主机A希望向主机B发送一个IP数据报，A的ARP缓存不包含B的MAC地址，B的ARP缓存也不包含A的MAC地址。进一步假定交换机S1的转发表仅包含主机B 和路由器R1的表项。因此，A将广播一个ARP请求报文。

+ 一旦交换机S1收到ARP请求报文将执行什么操作?

  - 在表中存储主机A的MAC地址、该帧到达的接口

+ 路由器R1也会收到这个ARP 请求报文吗？

  - 不会。因为交换机S1已经存储了主机A的MAC地址。

+ 如果收到的话，R1将向子网3转发该报文吗？
+ 一旦主机B收到这个ARP请求报文，它将向主机A回发一个ARP响应报文。但是它将发送一个ARP查询报文来请求A的MAC地址吗?为什么?
+ 一旦交换机S1收到来自主机B的一个ARP 响应报文，它将做什么? 

== P21 现在考虑习题P14中的图6-33。对主机A、两台路由器和主机F的各个接口提供MAC地址和IP地址。假定主机A向主机F发送一个数据报。当在下列场合传输该帧时，给出在封装该IP数据报的帧中的源和目的MAC 地址：

=== （i）从A到左边的路由器；

src: 192.168.1.2, MAC-A
dst: 192.168.1.1, MAC-R1-左

=== （ii）从左边的路由器到右边的路由器；

src: 192.168.2.1, MAC-R1-右
dst: 192.168.2.4, MAC-R2-左

=== （iii）从右边的路由器到F。还要给出到达每个点时封装在该顿中的IP数据报中的源和目的IP地址。

src: 192.168.3.1, MAC-R2-右
dst: 192.168.3.3, MAC-F

== P31.在这个习题中，你将把已经学习过的因特网协议的许多东西拼装在一起。假设你走进房间，与以太网连接，并下载一个Web页面。从打开PC电源到得到Weeb网页，发生的所有协议步骤是什么?假设当你给PC加电时，在DNS 或浏览器缓存中什么也没有。（提示:步骤包括使用以太网、DHCP、ARP、 DNS、 TCP 利 HTTP 协议。）明确指出在这些步骤中你如何获得网关路由器的IP和MAC地址。

1. 打开PC电源时，网卡初始化并通过DHCP协议，PC向网络中的DHCP服务器请求IP地址、子网掩码、网关和DNS服务器的信息。

2. 获得本地IP地址后，PC需要确定网关路由器的MAC地址，以便正确发送数据帧。PC通过ARP协议广播请求，询问局域网中与网关IP地址相对应的MAC地址。

3. 网关路由器收到ARP请求后，会回复包含自己MAC地址的ARP响应。PC收到ARP响应后，获得了网关路由器的MAC地址。

4. PC通过DHCP获取了DNS服务器的IP地址，并使用DNS协议向DNS服务器查询目标Web页面的域名对应的IP地址。

5. 建立TCP连接：使用目标Web服务器的IP地址，PC通过TCP协议与Web服务器建立可靠的双向通信通道。

6. HTTP请求：通过TCP连接，PC向Web服务器发送HTTP请求，请求特定页面。

7. Web服务器接收到HTTP请求后，处理请求并准备发送相应的Web页面。

8. Web服务器通过TCP连接向PC发送HTTP响应，其中包含请求的Web页面的数据。

9. PC接收到Web服务器的HTTP响应后，浏览器解析响应，渲染并显示Web页面。
