CS144计算机网络Lab0: Networking Warmup
本文最后更新于:2024年1月19日 晚上
热身分为三个部分,第一部分要求用telnet
工具来发送一些简单的http请求,第二部分是写一个简单的webget
应用模拟使用telnet
是的操作,第三部分是完善一个ByteStream
来实现更底层的socket
写入读取等操作
第一部分 - Networking by hand
A. Fetch a Web page
通过在浏览器中访问http://cs144.keithw.org/hello
,我们得到一条信息Hello, CS144!
,现在让我们用telnet
来实现这个过程:
-
首先需要通过
telnet
与cs144.keithw.org
建立reliable byte stream
,并告诉对方我们我们接下来的请求将使用http
协议:1
2
3
4➜ ~ telnet cs144.keithw.org http
Trying 198.18.0.30...
Connected to cs144.keithw.org.
Escape character is '^]'.
现在我们就可以发送请求了
-
继续发送
1
2
3GET /hello HTTP/1.1
Host: cs144.keithw.org
Connection: close值得注意的是,服务器需要在超时之前接收到请求,我刚开始的时候一行一行地输入,由于打字速度感人,就会由于超时而收到
Connection closed by foreign host.
。除此之外,再写好请求后需要多按两次回车告诉telnet
发送该请求。 -
最后我们得到了理想的返回响应
1
2
3
4
5
6
7
8
9
10
11
12HTTP/1.1 200 OK
Date: Sun, 15 Oct 2023 04:38:14 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!
Connection closed by foreign host.
Assignment
最后有一个任务,要求从http://cs144.keithw.org/lab0/sunetid
获取secret code
,这个就非常的简单了
1 |
|
1 |
|
B.Send yourself an email
C. Listening and connecting
在上面我们使用telnet
向服务器发送请求,现在我们将成为一个简单的服务器,接受外部的信息
-
使用
netcat
监听9090端口1
2➜ ~ netcat -v -l -p 9090
Listening on 0.0.0.0 9090 -
在另一个终端中运行
telnet
,连接到本地的9090
端口1
2
3
4➜ ~ telnet localhost 9090
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'. -
现在,我们可以在两个终端之间互相发送信息了
1
2
3
4➜ ~ netcat -v -l -p 9090
Listening on 0.0.0.0 9090
Connection received on localhost 60162
hello, this is Ivan, bye~1
2
3
4
5➜ ~ telnet localhost 9090
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello, this is Ivan, bye~
第二部分 - Writing a network program using an OS stream socket
这一部分需要通过系统内建的stream socket
写一个简单的webget
来实现之前telnet
,具体来说,需要完善apps/webget.cc
中的get_URL
函数。我们可以参考doctests/address_example_1.cc
和doctests/socket_example_2.cc
,实际上就是初始化一个TCPSocket
并通过目标Address
建立连接,之后向服务求发送之前类似的请求
1 |
|
在Connection: close\r\n
之后,仍然需要写入一个回车
告诉socket
可以发送了,不然会一直等待直到超时。
测试一下
1 |
|
第三部分 - An in-memory reliable byte stream
这一部分要求我们根据pdf
中writer
和reader
的接口来完善libsponge/byte stream.hh
和libsponge/byte stream.cc
,并能处理比buffer
容量要长的多的字节流。
byte stream.hh
1 |
|
byte stream.cc
1 |
|
在一开始做这个实验的时候,完全不知道需要干什么,之前学的C++还有面向对象的知识都忘了不少。实际上只需要按照每个模块的功能一步步写+debug
就好了。
在测试的时候经常会出现The ByteStream should have had bytes_written equal to 0 but instead it was 1
这样的错误,后面发现是我在定义string_buffer
的时候把它初始化为了" "
,而正常应该是为空
。