news 2026/10/8 18:55:14

CS-144 checkpoint 0: networking warmup

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CS-144 checkpoint 0: networking warmup

Writing a network program using an OS stream socket


2026-10-07 · 完成 checkpoint 0 的第一部分:用 OS 提供的 stream socket 写一个最小化的 HTTP 客户端webget。

实验目标

Checkpoint 0 是整个 CS144 的热身关,目标有两个层次:

前置知识

1. stream socket 是什么:长得像文件描述符的字节流

对程序来说,socket 就是一个普通的文件描述符。两个 socket 建立连接后,一方write进去的字节,最终会按同样的顺序从另一方的 socket 里被read出来。传输过程中 TCP 替我们处理了分段、重传、排序、流量控制等一切脏活。

2. HTTP 请求就是一段文本

先用 telnet 手工体验过一遍(telnet cs144.keithw.org http后逐行敲):

GET /hello HTTP/1.1 Host: cs144.keithw.org Connection: close (空行)

要点:

3. 一个贯穿全程的对照:connect()就是三次握手

connect()返回时,TCP 的 SYN / SYN-ACK / ACK 三次握手已经完成。数据可靠性不是免费的,连接建立这一步本身就是协议在"谈条件"(同步序列号、确认双方可达)。

实现思路

get_URL(host, path)分四步走:

  1. 预约一个 endpoint:TCPSocket tcpSocket;—— 构造时调用socket(2),拿到一个未连接的 TCP socket(file descriptor)。
  2. 把名字翻译成地址:Address address(host, "http");—— 一次搞定两层解析:主机名 → IP 地址,服务名"http"→ 端口号 80。
  3. 发起连接:tcpSocket.connect(address);—— 触发三次握手。
  4. 收发文本:
    • 按 HTTP 规定的文本格式拼好请求(GET path HTTP/1.1+Host:+Connection: close+ 空行,全部\r\n),write()出去——注意write只是把字节交给内核的发送缓冲区,之后的可靠交付由 TCP 负责;
    • 循环read()并立刻打印,直到eof()。EOF 的语义:对端(服务器)关闭连接后,本端read返回 0 字节 →eof()为真 → 循环结束。所以Connection: close不仅是对服务器说"回完就关",也是在为客户端自己的读循环安排一个确定的终点。

代码实现

/* * apps/webget.cc */voidget_URL(conststring&host,conststring&path){// 预约一个 end-point (file-descriptor)TCPSocket tcpSocket;// 将域名解析为 IP 地址;将服务名解析为端口号Addressaddress(host,"http");// tcp 触发"三次握手"tcpSocket.connect(address);// 请求文本std::string require_str="GET "+path+" HTTP/1.1\r\nHost: "+host+"\r\nConnection: close\r\n\r\n";// write 把请求文本写入内核的发送缓存区,交给 tcp 处理后续工作tcpSocket.write(require_str);// read 读取后立刻打印std::string buffer;while(!tcpSocket.eof()){tcpSocket.read(buffer);cout<<buffer;}}

值得注意的两个点:

验证

  1. 构建:cmake --build build(或cmake --build build --target webget)。
  2. 自动测试:cmake --build build --target check_webget(等价于ctest -R webget)。测试脚本tests/webget_t.sh会让webget去抓cs144.keithw.org/nph-hasher/xyzzy,取输出的最后一行与一个已知哈希比对——所以输出必须和服务器返回的字节流一字不差。
  3. 手动验证:./apps/webget cs144.keithw.org /hello,应看到和浏览器、telnet 完全一样的响应(HTTP 头 + 正文)。

复盘

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 18:49:44

冬天掉的电会还给你,夏天掉的不会:笔记本电池的两条账

冬天掉的电会还给你&#xff0c;夏天掉的不会&#xff1a;笔记本电池的两条账 先分清两件事&#xff1a;一种损失会还给你&#xff0c;一种不会 现象你每年都遇到一次&#xff1a;冬天笔记本的续航从六小时变成三小时&#xff1b;手机在室外掉到 8% 直接黑屏&#xff0c;进屋放…

作者头像 李华
网站建设 2026/10/8 18:48:20

AI 论文降重改写,几款常用降AI率软件选哪个才不踩坑

摘要&#xff1a;本文围绕论文写作中的改写与降重需求&#xff0c;比较了几款常见的AI辅助工具&#xff0c;从改写能力、语言润色、引用规范等维度做横向梳理&#xff0c;并给出按写作阶段和语种匹配的选型思路。结论是先看清自己卡在改写还是润色&#xff0c;再决定用哪一类工…

作者头像 李华
网站建设 2026/10/8 18:47:58

pstack+Claude Code:AI辅助定位C++服务线程卡死与死锁

做后端服务维护的朋友&#xff0c;大概率都碰过这种场景&#xff1a;线上进程还挂着&#xff0c;端口能通&#xff0c;业务却像被按了暂停键&#xff0c;请求全部卡住。我第一次被拉去处理这类问题时&#xff0c;第一反应就是掏出 pstack 打一份线程栈&#xff0c;结果面对 80 …

作者头像 李华