计算机网络:自顶向下方法–课后习题
第二章
SMS(短消息服务)是一种允许通过蜂窝网络在移动电话之间发送和接收文本消息的技术。一条短信可以包含140字节的数据,它支持国际语言。消息的最大大小可以是160个7位字符、140个8位字符或70个16位字符。短信通过ss# 7协议的移动应用部分(MAP)实现,短信协议由3GPP TS 23.040和3GPP TS 23.041定义。此外,MMS(多媒体消息服务)扩展了原始文本消息的功能,并支持发送照片、较长的文本消息和其他内容。
iMessage是苹果公司开发的一种即时通讯服务。iMessage支持通过移动数据网络或WiFi发送到iOS设备和mac上的文本、照片、音频或视频。苹果的iMessage是基于专有的二进制协议APNs(苹果推送通知服务)。
WhatsApp Messenger是一种即时通讯服务,支持许多移动平台,如iOS、Android、手机和黑莓。WhatsApp用户可以通过蜂窝数据网络或WiFi相互发送无限制的图片、文本、音频或视频。WhatsApp使用XMPP协议(可扩展消息传递和到场协议)。
http://gaia.cs.umass.edu/cs453/index.html
HTTP/1.1
Mozilla/5.0
;服务器需要浏览器类型信息来将同一对象的不同版本发送给不同类型的浏览器Tue, 07 Mar 2008 12:39:45GMT
Sat, 10 Dec2005 18:27:46GMT
3874bit
;同意持续连接
HTTP1.1规范
a) 都可以。客户端或服务器在连接头字段中标识Connection: close,即可通知对方关闭连接。
b) HTTP不提供任何的加密服务。
c) 使用持久连接的客户端应该限制它们与给定服务器的同时连接的数量。单用户客户端不应该与任何服务器或代理保持超过2个连接。
d) 是的。当服务器决定关闭“空闲”连接时,客户机可能已经开始发送新的请求。从服务器的角度来看,连接在空闲时被关闭,但从客户端的角度来看,请求正在进行。
经过 R T T 1 + R T T 2 + ⋯ + R T T n RTT_1 + RTT_2 + ⋯ + RTT_n RTT1+RTT2+⋯+RTTn 时间获取到了目标IP地址后,就需要消耗 R T T 0 RTT_0 RTT0 的时间来建立TCP握手连接,然后又需要 R T T 0 RTT_0 RTT0 的时间来建立TCP数据连接。
对象传输时间为0,所以一共耗时: 2 R T T 0 + R T T 1 + R T T 2 + ⋯ + R T T n 2RTT_0 +RTT_1 +RTT_2 +⋯+ RTT_n 2RTT0+RTT1+RTT2+⋯+RTTn
注意!这里是引用了8个小对象,不是只请求8个小对象,所以原来的页面要算进去的。
a. R T T 1 + ⋯ + R T T n + 2 R T T 0 + 8 × 2 R T T 0 RTT_1 +⋯+ RTT_n + 2RTT_0 + 8 \times 2RTT_0 RTT1+⋯+RTTn+2RTT0+8×2RTT0
b. R T T 1 + ⋯ + R T T n + 2 R T T 0 + 2 × 2 R T T 0 RTT_1 + ⋯ + RTT_n + 2RTT_0 + 2 \times 2RTT_0 RTT1+⋯+RTTn+2RTT0+2×2RTT0
c.
管道连接(HTTP Pipelining)其实是把多个HTTP请求放到一个TCP连接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应。
a.
接入链路通过15Mbps速度发送一个对象的时间是: Δ = L R = 850 , 000 ( b i t s ) 15 , 000 , 000 ( b i t s / s e c ) = 0.0567 ( s e c ) Δ = \frac{L}{R} = \frac{850,000(bits)}{ 15,000,000(bits/sec)} = 0.0567(sec) Δ=RL=15,000,000(bits/sec)850,000(bits)=0.0567(sec)
平均到达率: Δ β = 16 ( r e q u e s t s / s e c ) × 0.0567 ( s e c ) = 0.907 \Delta\beta=16(requests/sec) \times 0.0567(sec)=0.907 Δβ=16(requests/sec)×0.0567(sec)=0.907
注意!这里的平均到达率不是指请求最终能到达多少,而是指的流量强度。所以 Δ β Δβ Δβ 接近1时,分母接近0,平均相应时间无限大。
流量强度的公式: I = δ × L R I = \frac{\delta\times L}{R} I=Rδ×L , δ \delta δ 为请求量。
代入公式:
Δ ( 1 − Δ β ) \frac{\Delta}{(1-\Delta\beta)} (1−Δβ)Δ
得到发送一个对象的平均时间为: 0.0567 ( s e c ) ( 1 − 0.907 ) ≈ 0.6 ( s e c ) \frac{0.0567(sec)} {( 1 − 0.907 )} \approx 0.6(sec) (1−0.907)0.0567(sec)≈0.6(sec)由于初始服务器每个请求的平均处理时间为3秒,所以总的平均响应时间为 0.6 + 3 = 3.6 ( s e c ) 0.6 + 3 = 3.6(sec) 0.6+3=3.6(sec)。
b.
由于 40 40 40% 的请求被高速以太网立刻返回,因此接入链路上的流量强度降低了 40 40 40% ,可以得出 Δ β ( I ) = δ × 0.6 × L R 0.0567 × 16 × 0.6 = 0.54432 \Delta\beta (I) = \frac{\delta \times 0.6 \times L}{R}0.0567\times16\times0.6=0.54432 Δβ(I)=Rδ×0.6×L0.0567×16×0.6=0.54432
因此,发送一个对象的平均时间为: Δ = 1 1 − I × L R = 0.0567 ( s e c ) 1 − 0.54432 = 0.12 ( s e c ) \Delta = \frac{1}{1-I}\times \frac{L}{R} = \frac{0.0567(sec)}{1-0.54432}=0.12(sec) Δ=1−I1×RL=1−0.544320.0567(sec)=0.12(sec)
如果缓存满足要求,响应时间大约为 0 0 0,接入链路的时间为 Δ = 850 , 000 ( b i t s ) ÷ 100 , 000 , 000 ( b i t s / s e c ) = 0.0085 ( s e c ) \Delta=850,000(bits)\div100,000,000(bits/sec)=0.0085(sec) Δ=850,000(bits)÷100,000,000(bits/sec)=0.0085(sec);
缓存未命中的平均响应时间为 0.12 ( s e c ) + 3 ( s e c ) = 3.12 ( s e c ) 0.12(sec)+3(sec)= 3.12(sec) 0.12(sec)+3(sec)=3.12(sec) .
总的响应时间为: 0.4 ( s e c ) × 0.0085 ( s e c ) + 0.6 × 3.12 ( s e c ) = 1.8754 ( s e c ) 0.4(sec)\times0.0085(sec)+0.6\times3.12(sec)=1.8754(sec) 0.4(sec)×0.0085(sec)+0.6×3.12(sec)=1.8754(sec)
控制分组:连接建立,连接确认的分组
10米短链路,忽略其传播时延。从图中可以看出,下载一个对象需要 t 1 = 3 × 200 ( b i t ) 150 ( b i t ) + 100 ( k b i t ) 150 ( b i t ) t_1 = 3 \times\frac{200(bit)}{150(bit)}+\frac{100(kbit)}{150(bit)} t1=3×150(bit)200(bit)+150(bit)100(kbit) 的时间, 如果是非持续并行下载,则需要考虑将链路分为10等分,由于是并行,所以只需要算一个就可以。
如果是持续性连接,在图中我们可以看出第一个对象仍旧需要 t 1 t_1 t1 的时间,但是后续请求的十个对象无需建立连接,因为用的是持续连接,直接发送请求报文即可,故后面请求的对象需要的时间为: 10 × ( 200 ( b i t ) 150 ( b i t ) + 100 ( k b i t ) 150 ( b i t ) ) 10 \times (\frac{200(bit)}{150(bit)}+\frac{100(kbit)}{150(bit)}) 10×(150(bit)200(bit)+150(bit)100(kbit))。
两种方式产生的效益差不了多少,主要是因为链路带宽太小。
from socket import *
serverPort=12000
serverSocket=socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('',serverPort))
serverSocket.listen(1)
while 1:
connectionSocket, addr = serverSocket.accept()
sentence = connectionSocket.recv(1024).decode()
print('From Server:', sentence, '\n')
serverSocket.close()
MAIL FROM
指的是来自SMTP客户端的消息,它标识发送给SMTP服务器的邮件的发送方。From
不是SMTP消息,而是邮件消息正文中的一行。.
来标识报文体的结束。Content-Length
来记录报文的长度。.
结束,相比,SMTP的报文体只能是7位ASCII字符。MTA
代表邮件传输代理。主机将消息发送到MTA
。然后该消息遵循一系列MTA
到达接收者的邮件阅读器。我们看到此垃圾邮件遵循一系列MTA
。诚实的MTA
应该报告收到消息的位置。请注意,在此消息中,asusus-4b96([58.88.21.177])
没有报告它从何处收到电子邮件。既然我们假设只有发起者是不诚实的,那么 asusus-4b96([58.88.21.177])
一定是发起者。UIDL
是唯一识别码列表(unique-ID listing)的缩写。当一个POP3客户端
发出一个UIDL
命令,服务器返回存储在用户邮箱里的所有邮件的唯一标识码。这个命令对下载并保留方式有用。通过保留上次收取的邮件的列表信息,客户能够使用UIDL
来确定在服务器上的哪些邮件是被阅读过的。list
+OK 3 14907
1 9125
2 3406
3 2376
.
retr 1
blah blah ...
..........blah
.
dele 1
+OK core mail
quit
+OK core mail
list
+OK 2 5782
2 3406
3 2376
.
retr 2
blah blah ...
..........blah
.
quit
+OK core mail
list
+OK 2 5782
2 3406
3 2376
.
retr 3
blah blah ...
..........blah
.
retr 2
blah blah ...
..........blah
.
quit
+OK core mail
a. whois
(读作“Who is”,非缩写)是用来查询域名的IP以及所有者等信息的传输协议。简单说,whois就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商)。通过whois来实现对域名信息的查询。早期的whois查询多以命令列接口存在,但是现在出现了一些网页接口简化的线上查询工具,可以一次向不同的数据库查询。网页接口的查询工具仍然依赖whois协议向服务器发送查询请求,命令列接口的工具仍然被系统管理员广泛使用。whois通常使用TCP协议43端口。每个域名/IP的whois信息由对应的管理机构保存。
b. dns8.hichina.com,dns7.hichina.com
c.
C:\Users\asus>nslookup -qt=ns www.baidu.com
服务器: UnKnown
Address: *
非权威应答:
www.baidu.com canonical name = www.a.shifen.com
a.shifen.com
primary name server = ns1.a.shifen.com
responsible mail addr = baidu_dns_master.baidu.com
serial = 2202210005
refresh = 5 (5 secs)
retry = 5 (5 secs)
expire = 2592000 (30 days)
default TTL = 3600 (1 hour)
C:\Users\asus>nslookup -qt=A www.baidu.com
服务器: UnKnown
Address: *
非权威应答:
名称: www.a.shifen.com
Addresses: 14.215.177.38
14.215.177.39
Aliases: www.baidu.com
C:\Users\asus>nslookup -qt=MX www.baidu.com
服务器: UnKnown
Address: *
非权威应答:
www.baidu.com canonical name = www.a.shifen.com
a.shifen.com
primary name server = ns1.a.shifen.com
responsible mail addr = baidu_dns_master.baidu.com
serial = 2202210005
refresh = 5 (5 secs)
retry = 5 (5 secs)
expire = 2592000 (30 days)
default TTL = 3600 (1 hour)
总结: www.baidu.com
有多个IP地址。
d. 见上
**e. ** 略
f. 攻击者可以使用whois数据库和nslookup工具来确定目标机构的IP地址范围、DNS服务器地址等 。
g. whois 是用来查询域名的IP以及所有者等信息的传输协议,简单说,whois就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商)。通过whois来实现对域名信息的查询。 同时, 在用户受到网络攻击时,通过分析攻击数据包的源地址,受害者可以使用whois获取有关攻击所来自的域的信息,并可能通知原始域的管理员。
a. 以下是 gaia.cs.umass.edu 的查询委托链路:首先查询根服务器,然后总是选择第一个服务器,最后就可以查到 gaia.cs.umass.edu 的 IP 地址 。
# dig +norecurse @a.root-servers.net any gaia.cs.umass.edu
...
;; AUTHORITY SECTION:
edu. 172800 IN NS f.edu-servers.net.
edu. 172800 IN NS a.edu-servers.net.
edu. 172800 IN NS g.edu-servers.net.
edu. 172800 IN NS l.edu-servers.net.
edu. 172800 IN NS c.edu-servers.net.
edu. 172800 IN NS d.edu-servers.net.
...
# dig +norecurse @f.edu-servers.net any gaia.cs.umass.edu
...
;; AUTHORITY SECTION:
umass.edu. 172800 IN NS ns1.umass.edu.
umass.edu. 172800 IN NS ns3.umass.edu.
umass.edu. 172800 IN NS ns2.umass.edu.
...
# dig +norecurse @ns1.umass.edu any gaia.cs.umass.edu
...
;; ANSWER SECTION:
gaia.cs.umass.edu. 21600 IN MX 0 barramail.cs.umass.edu.
gaia.cs.umass.edu. 21600 IN A 128.119.245.12
...
b. 查询 google.com 时的链路,类似的:
dig
在本地DNS服务器中查询该网站例如,dig cnn.com
将返回查找cnn.com
的查询时间。如果cnn.com
在几秒钟前刚刚被访问,那么cnn.com
的一个条目缓存在本地DNS缓存中,因此查询时间为 0 m s e c 0 msec 0msec 。否则,查询时间会很长。客户-服务器:
与u无关.
t = m a x { N F u s , F d i } t = max\left\{\frac{NF}{u_s}, \frac{F}{d_i}\right\} t=max{usNF,diF}
N | t |
---|---|
10 | 7680s |
100 | 51200s |
1000 | 512000s |
随着客户端的增多,服务器的分发时间会随着客户端的增加而增加。
P2P:
t = m a x { F u s , F d i , N F ( u s + N u ) } t = max\left\{\frac{F}{u_s},\frac{F}{d_i},\frac{NF}{(u_s+Nu)}\right\} t=max{usF,diF,(us+Nu)NF}
t | N | 10 | 100 | 1000 |
---|---|---|---|---|
u | ||||
300kps | 7680s | 25600s | 46454s | |
700kps | 7680s | 15300s | 21041s | |
2Mbps | 7680s | 7680s | 7680s |
随着peer节点上载能力的增加,节省的时间会越来越多。
P2P: D P 2 P ≥ m a x { F U S , F d m i n , N F U S + ∑ i = 1 N u i } D_{P2P} \geq max \left\{ \frac{F}{U_S}, \frac{F}{d_{min}}, \frac{NF}{U_S+\sum_{i=1}^{N}u_i}\right\} DP2P≥max{USF,dminF,US+∑i=1NuiNF}.
a. U s ≤ U s + U N Us \leq \frac{U_s+U}{N} Us≤NUs+U,其中 U = u 1 + u 2 + u 3 + . . . + u n U = u_1+u_2+u_3+...+u_n U=u1+u2+u3+...+un,定义一个具有 F U S \frac{F}{U_S} USF 的分发方案。
按照客户上载带宽占整个上载带宽总和的比值来划分服务器的上载带宽 ,也就是按照客户端上载的能力来进行划分服务器的上载带宽。
从服务器角度来看,整个获得的上载加在一起不能超过 U s U_s Us;从客户端角度来看,向其他节点提供服务的"吐出"要符合当前节点的上载带宽,下载带宽也要符合当前节点的下载带宽。也就是说从入和出的角度来看是否符合他的上行带宽和下行带宽,如果符合这种分发方案就是可行的。
①从对等方上载来看
( N − 1 ) × U i U × U s ≤ U i (N-1)\times \frac{U_i}{U} \times U_s \leq U_i (N−1)×UUi×Us≤Ui, 其中 U i U × U s \frac{U_i}{U} \times U_s UUi×Us 为当前节点能够为其他节点提供的上载能力,即为其他 N − 1 N-1 N−1 个节点提供服务的上载带宽小于等于当前节点的上载带宽。
②从服务器上载来看
∑ i = 1 N r i = ∑ i = 1 N U i U × U s = U s \sum_{i=1}^{N}r_i = \sum_{i=1}^{N} \frac{U_i}{U}\times U_s = U_s ∑i=1Nri=∑i=1NUUi×Us=Us.
③从客户端下载来看,由于 d m i n d_{min} dmin 很大,所以客户端的下载带宽不会成为瓶颈。
最后可以得到分发时间为 F U s \frac{F}{U_s} UsF.
b. U s ≥ U s + U N Us \geq \frac{U_s+U}{N} Us≥NUs+U,其中 U = u 1 + u 2 + u 3 + . . . + u n U = u_1+u_2+u_3+...+u_n U=u1+u2+u3+...+un,定义一个具有 N F U s + ∑ i = 1 N u i \frac{NF}{U_s+\sum_{i=1}^{N}u_i} Us+∑i=1NuiNF 的分发方案。
从服务器来看
r 1 + r 2 + . . . + r N + N × r N + 1 = U N − 1 + N × U s − U N − 1 N = U s r_1+r_2+...+r_N+N \times r_N+1 = \frac{U}{N-1} + N\times \frac{U_s - \frac{U}{N-1}}{N} = U_s r1+r2+...+rN+N×rN+1=N−1U+N×NUs−N−1U=Us
从peer来看
U N − 1 + U s − U N − 1 N = U s + U N \frac{U}{N-1} + \frac{U_s - \frac{U}{N-1}}{N} = \frac{U_s+U}{N} N−1U+NUs−N−1U=NUs+U
得 F U s + U N = F N U s + U \frac{F}{\frac{U_s+U}{N}} = \frac{FN}{U_s+U} NUs+UF=Us+UFN.
Sybil攻击
。TCPClient
,那么客户机将尝试与不存在的服务器进程建立TCP连接。将不会建立TCP连接。UDPClient
不与服务器建立TCP连接。因此,如果您首先运行UDPClient
,然后运行UDPServer
,然后在键盘上键入一些输入,那么一切都可以正常工作。UDPClient
在创建套接字时未指定端口号。 在这种情况下,代码允许底层操作系统选择端口号。 使用附加行,当执行UDPClien
t时,将创建一个端口号为5432的UDP套接字。UDPServer
需要知道客户端端口号,以便它可以将数据包发送回正确的客户端套接字。 看一下UDPServer
,我们看到客户端端口号没有“硬连线”到服务器代码中; 相反,UDPServer
通过解析从客户端接收的数据报来确定客户端端口号。 因此UDP服务器将使用任何客户端端口号,包括5432.因此不需要修改UDPServer
。TCP
连接在其他应用程序中,我们可能会发送一系列在它们之间具有固有边界的消息。TCP
没有指示边界的机制,应用程序必须自己添加指示,以便应用程序的接收端能够区分消息。UDP
段中,接收端就可以这样做在应用程序的发送端不添加任何指示的情况下区分各种消息。Apache
,它是开源的并且是免费的。多年来,开源社区对它进行了高度优化 。