Kiprey / Kiprey.github.io

This is Kiprey‘s Blog.
https://kiprey.github.io/
4 stars 3 forks source link

CS144计算机网络 Lab0 | Kiprey's Blog #78

Open Kiprey opened 2 years ago

Kiprey commented 2 years ago

https://kiprey.github.io/2021/11/cs144-lab0/

lyhellcat commented 2 years ago

image 题目的性能要求是1.5s, 但我在本地WSL(i7 9750)运行与服务器(64核心)的结果性能差距甚远? ....

Kiprey commented 2 years ago

因为 webget 会向国外服务器发送请求,所以这一步取决于网速。网速快一点就一秒以内,慢一点就要好几秒了。

lyhellcat commented 2 years ago

@Kiprey 因为 webget 会向国外服务器发送请求,所以这一步取决于网速。网速快一点就一秒以内,慢一点就要好几秒了。

噢噢确实 感谢回复

derecknowayback commented 1 year ago

大佬,同样的代码,跑不过check_webget是怎么回事啊

Kiprey commented 1 year ago

大佬,同样的代码,跑不过check_webget是怎么回事啊

我有点忘记 check_webget 是跑什么逻辑了,如果没记错的话这个会向国外服务器发送一个请求,这个请求的成功与否取决于你的网络能否顺利连接国外网站。

derecknowayback commented 1 year ago

@Kiprey

大佬,同样的代码,跑不过check_webget是怎么回事啊

我有点忘记 check_webget 是跑什么逻辑了,如果没记错的话这个会向国外服务器发送一个请求,这个请求的成功与否取决于你的网络能否顺利连接国外网站。

能连接,报的是recipe for target 'CMakeFiles/check_webget' failed,不是答案错误那个“ebget returned output that did not match the test's expectations” 那个Error,可能是cmake有问题?

Kiprey commented 1 year ago

@Kiprey

大佬,同样的代码,跑不过check_webget是怎么回事啊

我有点忘记 check_webget 是跑什么逻辑了,如果没记错的话这个会向国外服务器发送一个请求,这个请求的成功与否取决于你的网络能否顺利连接国外网站。

能连接,报的是recipe for target 'CMakeFiles/check_webget' failed,不是答案错误那个“ebget returned output that did not match the test's expectations” 那个Error,可能是cmake有问题?

重新 cmake 一下看看,太久没碰这个了(捂脸)

derecknowayback commented 1 year ago

@Kiprey

@Kiprey

大佬,同样的代码,跑不过check_webget是怎么回事啊

我有点忘记 check_webget 是跑什么逻辑了,如果没记错的话这个会向国外服务器发送一个请求,这个请求的成功与否取决于你的网络能否顺利连接国外网站。

能连接,报的是recipe for target 'CMakeFiles/check_webget' failed,不是答案错误那个“ebget returned output that did not match the test's expectations” 那个Error,可能是cmake有问题?

重新 cmake 一下看看,太久没碰这个了(捂脸)

啊remake了哈哈,但是没有用,我再看看。

Arashimu commented 1 year ago

能问一下我为什么make check lab0的时候报错../tap.sh not found,我看官方的仓库也没有这个文件啊,一开始是../tun.sh not found,然后我去官网找到了一份tun.sh的代码,然后就../tap.sh not found 了

derecknowayback commented 1 year ago

@Arashimu 能问一下我为什么make check lab0的时候报错../tap.sh not found,我看官方的仓库也没有这个文件啊,一开始是../tun.sh not found,然后我去官网找到了一份tun.sh的代码,然后就../tap.sh not found 了

lab0不需要使用tun.sh好像,你的报错有更多信息吗

Arashimu commented 1 year ago

@derecknowayback

@Arashimu 能问一下我为什么make check lab0的时候报错../tap.sh not found,我看官方的仓库也没有这个文件啊,一开始是../tun.sh not found,然后我去官网找到了一份tun.sh的代码,然后就../tap.sh not found 了

lab0不需要使用tun.sh好像,你的报错有更多信息吗

没有,就一直缺少这个文件

Kiprey commented 1 year ago

@Arashimu 能问一下我为什么make check lab0的时候报错../tap.sh not found,我看官方的仓库也没有这个文件啊,一开始是../tun.sh not found,然后我去官网找到了一份tun.sh的代码,然后就../tap.sh not found 了

因为你的命令中多了一个空格,是 make check_lab0 而非 make check lab0。前者对应的测试指令是 tests.cmake#L218,而后者对应的是 tests.cmake#L235

Hoooao commented 1 year ago

所以超出buffer上限的数据直接抛弃了吗?我以为测试是多进程,和OS的输入输出buffer一样涉及sleep/wakeup😂

Kiprey commented 1 year ago

所以超出buffer上限的数据直接抛弃了吗?我以为测试是多进程,和OS的输入输出buffer一样涉及sleep/wakeup😂

其实原理是差不多的:

  1. TCP 中超过接收 buffer 上限的数据会被直接丢弃,让发送方一直重复发送,直到接收方有空闲空间存储。
  2. 而 OS 中超过的数据根本就不会被写入 buffer,而是让写者挂起,直到 buffer 存在空间再写入。
Kiprey commented 1 year ago

顺便问问这个 CS144 系列的博客是被哪里引用了,感觉最近问 CS144 的同学不少 😂

derecknowayback commented 1 year ago

@Kiprey 顺博问问这个 CS144 系列的博客是被哪里引用了,感觉最近问 CS144 的同学不少 😂

CS自学指南捏 https://csdiy.wiki/(谢谢k大一把shit一把尿把我拉扯到lab4,今天终于写完了lab4了hhh

Kiprey commented 1 year ago

@Kiprey 顺博问问这个 CS144 系列的博客是被哪里引用了,感觉最近问 CS144 的同学不少 😂

CS自学指南捏 https://csdiy.wiki/(谢谢k大一把shit一把尿把我拉扯到lab4,今天终于写完了lab4了hhh

嘿嘿,牛啊 QwQ

liyishui2003 commented 9 months ago

想问一下输入 GET /hello HTTP/1.1 Host: cs144.keithw.org Connection: close

之后直接跳Connection closed by foreign host.如何解决? 虚拟机能翻墙,应该不是梯子的问题
Kiprey commented 9 months ago

@liyishui2003 想问一下输入 GET /hello HTTP/1.1 Host: cs144.keithw.org Connection: close

之后直接跳Connection closed by foreign host.如何解决? 虚拟机能翻墙,应该不是梯子的问题

来张图片? 我刚刚重新试了一下是可以正常连的,可以对照一下上面 telnet 那张图来看看少了哪些输出信息。

liyishui2003 commented 9 months ago
image

图来了!输出信息倒是没有少,我无论复制粘贴还是手打,一输完都会被立马关掉。。谢谢指点!

Kiprey commented 9 months ago

@liyishui2003 一输完都会被立马关掉

从你的图上看,网络方面是没有问题。 我做了多次测试,排除了连接超时的可能性:

  1. 如果什么输入都没有的话,超时时间是 50s 并静默断开连接。
  2. 如果已经输入了单行或多行内容,则超时时间是 20s 并会显著返回 408 Request Timeout

你可以试着控制一下变量,不用 telnet 试试,比如用 nc 看看:

$ printf "GET /hello HTTP/1.1\r\nHost: cs144.keithw.org\r\nConnection: close\r\n\r\n" | nc cs144.keithw.org 80
HTTP/1.1 200 OK
Date: Sat, 06 Jan 2024 11:01:05 GMT
Server: Apache
Last-Modified: Thu, 13 Dec 2018 15:45:29 GMT
ETag: "e-57ce93446cb64"
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Content-Type: text/plain

Hello, CS144!

顺带注意一下在 telnet 里输入完成最后一行并回车后,还需要在 空行位置 再按一次回车,这个空行的回车标志着 HTTP 头的终止,按完这个空行处的回车后会立即有返回结果,而不会卡住继续等待输入。

liyishui2003 commented 9 months ago

@Kiprey

@liyishui2003 一输完都会被立马关掉

从你的图上看,网络方面是没有问题。 我做了多次测试,排除了连接超时的可能性:

  1. 如果什么输入都没有的话,超时时间是 50s 并静默断开连接。
  2. 如果已经输入了单行或多行内容,则超时时间是 20s 并会显著返回 408 Request Timeout

你可以试着控制一下变量,不用 telnet 试试,比如用 nc 看看:

$ printf "GET /hello HTTP/1.1\r\nHost: cs144.keithw.org\r\nConnection: close\r\n\r\n" | nc cs144.keithw.org 80
HTTP/1.1 200 OK
Date: Sat, 06 Jan 2024 11:01:05 GMT
Server: Apache
Last-Modified: Thu, 13 Dec 2018 15:45:29 GMT
ETag: "e-57ce93446cb64"
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Content-Type: text/plain

Hello, CS144!

顺带注意一下在 telnet 里输入完成最后一行并回车后,还需要在 空行位置 再按一次回车,这个空行的回车标志着 HTTP 头的终止,按完这个空行处的回车后会立即有返回结果,而不会卡住继续等待输入。

感谢答复!我输入这条命令“printf "GET /hello HTTP/1.1\r\nHost: cs144.keithw.org\r\nConnection: close\r\n\r\n" | nc cs144.keithw.org 80”没有任何输出,直接跳到要输出新命令;输入"netcat cs144.keithw.org http"的话等待非常久也没有任何响应。我用的是NAT模式共享主机代理,在虚拟机终端输入"curl https://www.youtube.com "或者其他外网ip是能得到正确响应的。此外,我确认自己的防火墙有开放23端口,xinetd服务是打开的(也就是telnet是真有下),所以我感到非常不解。

Kiprey commented 9 months ago

@liyishui2003

感谢答复!我输入这条命令“printf "GET /hello HTTP/1.1\r\nHost: cs144.keithw.org\r\nConnection: close\r\n\r\n" | nc cs144.keithw.org 80”没有任何输出,直接跳到要输出新命令;输入"netcat cs144.keithw.org http"的话等待非常久也没有任何响应。我用的是NAT模式共享主机代理,在虚拟机终端输入"curl https://www.youtube.com "或者其他外网ip是能得到正确响应的。此外,我确认自己的防火墙有开放23端口,xinetd服务是打开的(也就是telnet是真有下),所以我感到非常不解。

从所描述的 nc 效果来看,应该还是网络问题。控制变量使用 curl 直接访问 cs144.keithw.org/hello 试试,如果一切正常则会输出下列内容。注意:cs144 网站应该可以在无代理下访问,我已尝试在关闭代理后成功用 curl 访问。网络问题比较复杂,只能多尝试多切换代理开关等多试试了。

➜  ~ curl google.com  -v
*   Trying 46.82.174.69:80...
^C
# 已关闭代理,因此无法访问 google

➜  ~ curl cs144.keithw.org/hello -v
*   Trying 104.196.238.229:80...
* Connected to cs144.keithw.org (104.196.238.229) port 80 (#0)
> GET /hello HTTP/1.1
> Host: cs144.keithw.org
> User-Agent: curl/8.1.2
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 06 Jan 2024 16:51:27 GMT
< Server: Apache
< Last-Modified: Thu, 13 Dec 2018 15:45:29 GMT
< ETag: "e-57ce93446cb64"
< Accept-Ranges: bytes
< Content-Length: 14
< Content-Type: text/plain
<
Hello, CS144!
* Connection #0 to host cs144.keithw.org left intact