lab0
webget
用代码实现前面文档里的
main(argc, argv)
|
v
get_URL(host, path)
|
+-- Address(host, "http")
| 把主机名和服务名解析成 IP + port 80
|
+-- TCPSocket()
| 创建一个 TCP socket
|
+-- socket.connect(address)
| 让内核完成 TCP 三次握手
|
+-- socket.write(http_request)
| 把 HTTP 请求写进 TCP 字节流
|
+-- while (!socket.eof())
socket.read(response)
cout << response
tcp Transmission Control Protocol(传输控制协议) 在 IP 的基础上提供可靠的、有序的、面向连接的数据传输
ip Internet Protocol(网际协议) 负责将数据包(datagram)从源地址发送到目标地址
应用数据 “Hello” ↓ TCP层:加上 TCP Header → 形成 TCP Segment ↓ IP层:再加上 IP Header → 形成 IP Datagram ↓ 链路层:最后加上 Ethernet Header → 形成 Ethernet Frame ↓ 网络传输
byte_stream
为上层应用提供了一个符合直觉的、干净的“可靠字节流”接口。它屏蔽了底层网络的所有复杂性,是整个 TCP 实现最终交付给应用程序的核心成果
byte_stream本质是一块缓冲区,允许应用读取/写入数据
需要实现以下功能 1.is_closed 是否已经写入/读取完毕
2.push 向byte_stream写入数据
3.close 关闭byte_stream(数据全部写入)
4.available_capacity byte_stream剩余可以写入的容量
5.bytes_pushed 累计写入的字节数
6.is_finished 是否已经结束(数据全部读取)
7.bytes_popped 累计删除的数据
8.peek 从byte_stream读取数据
9.pop 删除byte_stream中的数据
10.bytes_buffered 当前byte_stream中的数据数量
这里有需要注意,peek不要求一次全部读出来