6.824 lab4,mit6.828 lab1
6.824实验1:简单的网络代理
实验一:一个简单的网络代理时间:2月10日,星期二,下午一点。简介请阅读《入门指南》
6.824次实验。你还需要使用三氯苯酚
在稍后的阶段通过套接字。
如有疑问,请先阅读办公时间和
问问题。做完这些后,你就可以给6.824-staff@pdos.lcs.mit.edu发电子邮件了。
在这个实验作业中,你将编写一个简单的网络代理。一张网
代理是一个程序,它从浏览器读取请求,转发请求
请求,读取来自网服务器的回复,并
将回复转发回浏览器。人们通常使用网络
代理缓存页面以获得更好的性能,修改网页
过境(例如,删除恼人的广告),或为弱
匿名。
您将编写一个网代理来学习如何构建
服务器。对于这项任务,你将从简单开始;尤其是你的
代理一次只需要处理一个连接。它应该接受
来自浏览器的新连接,完全处理请求并
响应,然后开始下一个连接。
(一个真正的网代理将能够处理许多连接
同时。)
在本讲义中,我们使用客户端来表示一个应用程序
以发送为目的建立连接的程序
请求[3],通常是网络浏览器(例如,
猞猁或网景公司).我们使用服务器来表示应用程序
接受连接以便通过以下方式为请求提供服务的程序
发回响应(例如服务器简史服务器)[1]。请注意,代理同时充当客户端和服务器。
此外,代理可以与其他代理(例如,高速缓存
层次)。
设计要求您的代理将使用HTTP/1.0协议的子集,即
在RFC 1945中定义。
您只负责HTTP/1.0的一小部分,所以您可以
忽略大部分规范。你应该确保你的代理人满足
这些要求:
得到请求工作。图像/二进制文件被正确传输。您的网络代理应该正确处理完全请求(RFC
1945,第4.1节)直到并包括65535字节。你应该
如果完整请求大于该值,则关闭连接。您必须支持带有数字互联网协议(Internet Protocol)地址的URL,而不是
服务器名称(例如http://18.181.0.31/)。不允许使用fork().您不能分配超过100MB的内存。打开的文件描述符不能超过32个。如果可能的话,您的代理应该正确地服务每个请求。如果
出现错误,代理可能会继续
后续请求,它应该关闭连接,然后继续
到下一个请求。如果出现代理无法避免的错误
合理地恢复,代理应该在
标准错误并调用从1号出口出去.不多
不可恢复的错误;也许唯一的失败是
初始套接字(),绑定(),
接听()呼叫,或接受()呼叫。这
除非在您无法控制的情况下,否则代理永远不应该转储核心
(例如,硬件或操作系统故障)。您不必担心任何
以下特征;尽可能忽略它们:
帖子或标题请求。除超文本传送协议(Hyper Text Transport Protocol的缩写)以外的任何类型的URL .超文本传送协议头(RFC
1945年,第4.2节)。如果您的浏览器可以通过您的代理获取页面和图像,并且
您的代理通过了我们的测试(见下文),您就大功告成了。
没有网代理的超文本传送协议示例超文本传送协议是在三氯苯酚上运行的请求/响应协议。一个客户
打开到网服务器的连接并发送文件请求;这
服务器响应一些状态信息和文件内容,
然后关闭连接。
你可以自己试试HTTP:
% telnet web.mit.edu 80
这将通过默认端口80连接到web.mit.edu
对于HTTP(网络)服务器。
然后打字
获取/HTTP/1.0
后面跟着两个回车。这就结束了
的请求。服务器定位网页并将其发送回来。你们
应该会在你的屏幕上看到。
为了形成要在服务器上检索的文件的路径
客户端接受机器名之后的所有内容。举个例子,
http://web.mit.edu/resources.html的意思是我们应该要求
如果您在
机器名和端口,然后假设/服务器数字
出刚给的时候返回什么页面/。通常是这样
默认页面是index.html或home.html .
在大多数服务器上,HTTP服务器位于端口80上。然而,一个
可以在统一资源定位器中指定不同的端口号。例如,打字
你浏览器中的http://web.mit.edu:2206会告诉它去找
web.mit.edu端口2206上的网服务器。(不,这不起作用
这个地址。)
使用网代理的HTTP(请求)示例在执行此示例之前,您需要告诉您的网浏览器
使用网代理。这个解释假设您正在运行Mozilla,
但是网景公司的情况应该非常相似。选择"编辑"
-"偏好"。然后选择"高级"
"代理人"。单击"手动代理配置"。现在设置
“HTTP代理"到speakeasy-mit-ron.lcs.mit.edu和端口3128。
浏览器名现在将所有超文本传送协议请求发送到这个网代理
而不是直接发送到网服务器。
山猫——穷人的浏览器——可以被告知使用这个网代理
将环境变量http_proxy设置为
speakeasy-MIT-Ron . LCS . MIT . edu:3128 .
现在来看看真正的东西。
您可以使用(美国)北卡罗来纳州来查看浏览器
发送到网代理nc。让您可以读写数据
使用用户数据报协议(User Datagram Protocol)或三氯苯酚的网络连接[10]。班级
机器安装了数控系统。
首先,我们将检查浏览器发送给代理的请求。
我们将使用(美国)北卡罗来纳州来监听端口并引导我们的网浏览器
(猞猁)将主机和端口用作代理。我们会让
(美国)北卡罗来纳州监听端口8888,并告诉猞猁使用网代理
在8888端口。
% nc -lp 8888
这告诉(美国)北卡罗来纳州监听端口8888。很有可能你
将不得不选择一个不同于8888的端口号,因为其他人可能会
正在使用那个端口。请选择一个大于1024小于65536的数字。现在
在同一台机器上,尝试检索网页端口8888作为代理:
% env http _ proxy=http://localhost:8888/lynx-source http://www.yahoo.com
这告诉猞猁使用一个
8888端口上的网代理,恰好是我们的间谍朋友
nc .
Netcat整齐地打印出猞猁发送的请求头:
% nc -lp 8888
获取http://www.yahoo.com/HTTP/1.0
主持人:www.yahoo.com
接受:文本/html、文本/普通、应用程序/vnd。rn-rn _ music _ package、application/x-freeamp-theme、audio/mp3、audio/mpeg、audio/x-mpeg、audio/x-mpeg gurl、audio/x-scpls、audio/mod、image/*、video/mpeg、video/*
接受:应用程序/pgp,应用程序/pdf,应用程序/后记,消息/部分、消息/外部正文、x-be2、应用程序/安德鲁-插图,文本/richtext,文本/增强型、x-sun-附件、音频文件、postscript文件、默认、邮件文件
接受:sun-deskset-message,application/x-metamail-patch,application/msword,text/sgml,*/*;q=0.01
接受编码:gzip,压缩
接受-语言:英语
用户代理:Lynx/2。8 .4版本。1 libwww-FM/2.14 SSL-MM/1。4 .1 OpenSSL/0.9。6 b
第一个得到请求告诉代理获取文件
使用超文本传送协议版的http://.注意这是如何
请求与没有网代理的示例完全不同!这
协议和机器名(http://www.yahoo.com)现在是
要求的一部分。在前一个例子中,这部分被省略了。
在RFC 1945中查找其余行的详细信息。(很有效
阅读材料如果你真的睡不着,陀思妥耶夫斯基没有做
诀窍。)
带有网代理的HTTP(回复)示例前面的示例显示了超文本传送协议请求。现在我们来看看
真实网代理(speakeasy-mit-ron.lcs.mit.edu端口3128)发送到网服务器。实现
这个我们用(美国)北卡罗来纳州来做一个假的网服务器。在上启动"假服务器"
anguish.lcs.mit.edu下达了如下命令:
% nc -lp 8888
同样,如果结果是8888,您可能必须选择不同的号码
别人拍的。
% env http _ proxy=http://speakeasy-MIT-Ron。LCS。麻省理工学院。http://anguish.lcs.mit.edu:8888 edu:3128/lynx来源
不用说,您应该用您选择运行的任何端口来替换8888
(美国)北卡罗来纳州开启nc。将显示以下请求:
% nc -lp 8888
获取/HTTP/1.0
接受:text/html、text/plain、audio/x-pn-realaudio、audio/vnd.rn-realaudio、application/smil、text/vnd.rn-realtext、video/vnd.rn-realvideo、image/vnd.rn-realflash、application/x-shock wave-flash 2-preview、application/sdp、application/x-sdp
接受:application/vnd.rn-realmedia、image/vnd.rn-realpix、audio/wav、audio/x-pn-wav、audio/x-pn-windows-acm、audio/basic、audio/x-pn-au、audio/aiff、audio/x-aiff、audio/x-pn-aiff、text/sgml、video/mpeg、image/jpeg、image/tiff
接受:image/x-rgb,image/png,image/x-xbim,image/x-xbm,image/gif,application/postscript,*/*;q=0.01
接受编码:gzip,压缩
接受-语言:英语
用户代理:Lynx/2.8.4rel.1 libwww-FM/2.14
主持人:苦闷. lcs.mit.edu:8888
X-RAN-Loopstop: true
X-RAN-Loopstop: true
via:1.0 speakeasy . Ron . LCS . MIT . edu:3128(squid/2.5。稳定2)、1.0 speakeasy . Ron . LCS . MIT . edu:3148(squid/2.5。稳定4)、1.0 NYU . Ron . LCS . MIT . edu:3128(squid/2.5。稳定4)
x-转发-收件人:18.26.4.9,127.0.0.1,未知
缓存控制:最大年龄=259200
连接:保持活动
请注意网代理是如何剥离
http://anguish.lcs.mit.edu:8888部分从请求!
您的网代理必须在
客户端使(以"获取http://计算机名"开头的那个)
转换成服务器能够理解的请求。坏消息到此为止。
好消息是我们为您提供了一些有用的代码
让这变得非常容易。
您的网代理将监听端口80以外的端口,以便
避免与常规网服务器冲突。
一旦接收到请求行,web代理应该
继续从客户端读取输入,直到遇到空白
线。然后,代理应该从适当的服务器获取URL,
将响应转发回客户端,并关闭连接。
代理应该在响应数据到达时转发它,而不是
缓冲整个响应;这允许代理处理巨大的
不会耗尽内存的响应。
您的网代理只需支持得到方法[3]。得到方法有两个参数:要
和超文本传送协议版本。附加标头可能跟在
请求。
入门我们已经提供了一个框架网络代理目录。可从以下网址获得
http://pdos.lcs.mit.edu/6.824/labs/webproxy1.tar.gz.以下的顺序
命令应该生成服务器的编译版本,您应该
扩展以通过测试。
% w获取http://pdos.lcs.mit.edu/6.824/labs/webproxy1.tar.gz
% tar xzvf webproxy1.tar.gz
% cd webproxy1
% gmake
油球包含http .c,http.h,
Makefile,webproxy1 .前两个文件将
帮助您解析超文本传送协议请求Makefile文件是,因为它的
有意义的名字意味着,Makefile .网络代理1 .c是一个漂亮的
无用的网络服务器,尽管如此,应该帮助你的方式web代理1-测试c是我们的测试程序,它检查你的程序的正确性。
http .我们已经为代理风格的超文本传送协议(Hyper Text Transport Protocol的缩写)请求提供了一个解析器。这是
在文件http .c和http.h分别是
包括在油球中。
http.h定义了这个类
从类继承的httpreq
httpparse(如果你不熟悉C继承,
请参考课程信息页面中引用的Stroustrup C语言指南。不要掉下来
某人脸上的这本书。这是一本相当厚的书。)
要解析请求,首先创建一个httpreq对象。
然后,解析(可能不完整的)HTTP请求,将它提供给
int parse (char *buf,ssize_t len)直到返回1,
表示报头是完整的100 . buf应该是
包含(可能不完整)HTTP请求的缓冲区。
低输入联网(low-entry networking的缩写)是中超文本传送协议请求片段的长度
buf .注意,解析需要看到
到目前为止,您已经阅读了全部请求。
如果超文本传送协议请求完成,解析返回1,如果
它需要更多的数据来完成,或者在解析错误时为-1。
从语法上分析不修改布法罗的内容。
一旦从语法上分析返回1,您就可以调用——其中包括——
在调用httpreq上使用以下方法。
char*方法()请求的"类型"(POST、GET、HEAD)char* host()目标主机短端口()目标端口char* path()被请求全球资源定位器(Uniform Resource Locator)的文件名部分char* url()被请求的统一资源定位器下面是一个简单的程序,它演示了
httpreq .
#包含标准视频
#包含 http.h
主()
http req * r=new http req();
char buf[512];
内部ret
//不完整的标头
strcpy(buf, GET http://web。麻省理工学院。edu指数。html’);
ret=r- parse(buf,strlen(buf));
printf(ret %d文件%s\n ,
ret,
ret==1?r-path():(none));
//完整标头
strcat(buf, HTTP/1.0 \ r \ n \ r \ n );
ret=r- parse(buf,strlen(buf));
printf(ret %d文件%s\n ,
ret,
ret==1?r-path():(none));
删除r;
退出(0);
您可能希望通过使用三氯苯酚阅读的文档
套接字来学习C/C中的套接字编程
看看这一页底部的参考资料。
运行和测试代理人您的代理程序应该只接受一个参数,一个端口号
听哪个。例如,要在端口2000上运行代理:
% ./webproxy1 2000
作为代理的第一个测试,您应该尝试使用它来浏览
网络。设置您的网浏览器以使用运行您的
代理作为代理,并试验各种不同的页面。
当您认为您的代理已经准备好了,您可以针对测试程序运行它
web proxy 1-测试,我们的测试人员。用你的代理运行测试器
作为一个论点:
% ./webproxy1-test ./webproxy1
请注意,这可能需要几分钟才能完成。测试程序运行
以下测试:
这个测试是"正常情况"。我们发送一个普通的HTTP 1.0获取
请求并期待正确的网页。
拆分请求该测试将超文本传送协议请求拆分为两个块。第一块
包含部分超文本传送协议请求。第二个块完成了
首先,测试人员希望得到正确的网页内容
回来。
大型请求测试仪发出的请求正好是65535字节。
大响应测试仪获取的网页大于最大数量
网代理可用的内存。
零大小响应测试人员获取一个没有正文的网页。
连接不良后恢复测试仪发送一个带有指定错误端口的统一资源定位器的请求。
您的代理将尝试连接到一个虚假的端口。快
此后,测试人员试图获取一个有效的页面,看看您的代理是否
还行。
请求格式不正确测试仪发送了一个语法不正确的超文本传送协议请求。
之后,它试图获取一个有效的页面,看看你的代理是否仍然
做得不错。
过早关闭客户端()测试人员发送一个部分超文本传送协议请求,然后关闭连接。
之后,它试图获取一个有效的页面,看看你的代理是否仍然
做得不错。
无限长的请求测试人员用大于65535字节的请求淹没您的代理。这
测试员希望您的代理关闭连接。之后,它会尝试
获取一个有效的页面,看看你的代理是否还正常。
压力测试测试人员使用以下无情的组合对您的网代理进行压力测试
普通提取、分割请求、畸形请求和大量响应。
这可能会暴露内存泄漏、未关闭的连接和随机的其他错误。
协作政策你必须写下你在编程作业中上交的所有代码,
除了我们作为任务的一部分给你的代码。你是
不允许看别人的解答(你也不允许
查看往年的解决方案)。你们可以讨论
和其他学生一起做作业,但你不可以看或抄
彼此的代码。
你应该交一份压缩的tarball webproxy1-handin.tgz制作的
由gmake区提供。将此文件复制到
~/handin/webproxy1-handin.tgz。不要创建此文件
全球可读!我们将尽可能使用文件的第一个副本
在截止日期后查找-我们每隔几分钟就尝试一次。不要费心去复制一个
新版本超过旧版本,希望我们将使用它代替。我们
不会。
参考资料1 Apache Web代理,http://www.apache.org/docs/mod/mod_proxy.html。
2伯纳斯-李等
1945年:超文本传输协议HTTP/1.0,5月
1996.3欧洲核研究组织网络代理,http://www.w3.org/Daemon/User/Proxies/Proxies.html。
4 Netcat。http://www.atstake.com/research/tools/nc110.txt.
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。