计算机网络 课程设计指导书
2一个简单的应用
下面的代码创建一个直接读取链路层数据包的原始套接字,并从中分析出源MAC地址和目的MAC地址,源IP和目的IP,以及对应的传输层协议,如果是TCP/UDP协议的话,打印其目的和源端口。为了方便阅读,程序中避免了使用任何与协议有关的数据结构,如structether_header,structiphdr等,当然,要完全理解代码,你需要关于指针以及位运算的知识。
/***************SimpelSniffer.c*************/ /*注意:本代码为LINUX操作系统下的源代码*/ //author:duanjigang@2006s #include
#define BUFFER_MAX 2048
int main(int argc, char *argv[]) { int sock, n_read, proto; char buffer[BUFFER_MAX]; char *ethhead, *iphead, *tcphead, *udphead, *icmphead, *p; if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0) {
fprintf(stdout, \ exit(0); } while(1) { n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL); /*
14 6(dest)+6(source)+2(type or length) +
20 ip header +
8 icmp,tcp or udp header = 42 */ if(n_read < 42) {
25
计算机网络 课程设计指导书
fprintf(stdout, \ continue; }
ethhead = buffer; p = ethhead; int n = 0XFF; printf(\ \ p[6]&n, p[7]&n, p[8]&n, p[9]&n, p[10]&n, p[11]&n, p[0]&n, p[1]&n, p[2]&n,p[3]&n, p[4]&n, p[5]&n); iphead = ethhead + 14; p = iphead + 12; printf(\ p[0]&0XFF, p[1]&0XFF, p[2]&0XFF, p[3]&0XFF, p[4]&0XFF, p[5]&0XFF, p[6]&0XFF, p[7]&0XFF); proto = (iphead + 9)[0]; p = iphead + 20; printf(\ switch(proto) { case IPPROTO_ICMP: printf(\ case IPPROTO_IGMP: printf(\ case IPPROTO_IPIP: printf(\ case IPPROTO_TCP : case IPPROTO_UDP : printf(\ printf(\ p[1]&0XFF); printf(\ break; case IPPROTO_RAW : printf(\ default:printf(\ } } }
26
计算机网络 课程设计指导书
附录5:简单Web Server程序
实现一个简单的Web Server,能够响应客户端的请求将指定目录下的HTML或text件通过指定的TCP端发送给客户端。具体编程要求是:
(1)服务器启动时可指定服务端口,默认为8000。 (2)可指定Web Server的根目录。
(3)服务器应能够并发处理多个请求。要求至少能支持Get命令。鼓励增强Web Server的功能,如支持Head、Post以及Delete等命令。
(4)统计Web Server接收和发送的流量。
(5)在Windows平台实现,要求使用图形界面显示服务器的各种信息。 (6)不允许使用已有的HTTP库。
(7)编写必要的客户端测试程序用于发送HTTP请求并显示返回结果,也可使用一般的Web浏览器测试。
5. 1相关知识
Web技术的独特之处是采用超链接和多媒体信息。Web服务器使用超文本标记语言(HTML- HyperText Marked Language)描述网络的资源,创建网页,以供Web浏览器阅读。HTML文档的特点是交互性。不管是一般文本还是图形,都能通过文挡中的链接连接到服务器上的其他文档,从而使客户快速地搜寻他们想要的资料。HTML网页还可提供表单供用户填写并通过服务器应用程序提交给数据库。这种数据库一般是支持多媒体数据类型的。
Web浏览器(Web Browser)是一个用于文档检索和显示的客户应用程序,并通过超文本传输协议Http(Hyper Text Transfer Protocol)与Web服务器相连。通用的、低成本的浏览器节省了两层结构的C/S模式客户端软件的开发和维护费用。
5.1.1 HTTP的工作过程
HTTP协议工作流程:
1.首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。 2.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息:包括请求修饰符、客户机信息和可能的内容。
3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4.客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
5.1.2 HTTP支持的有关方法
标准的万维网传输协议是超文本传输协议Http,每一次交互一个ASCII码请求,跟着一个与RFC822类似的Mime的应答组成。Http协议由两个相当明显的项组成:从浏览器到服务器的请
27
计算机网络 课程设计指导书
求集和从另一方向来的应答集,下面依次分析它们:
所有较新的Http(Http/1.1)都支持两种请求:简单请求和完全请求。简单请求只是一行声明了所需页面的get行,而没有协议版本(get/default.htm)。应答仅是原始的页面,没有头部,没有Mime,没有编码。表示完全请求的语句是get 请求行出现协议版本(get/default.html Http/1.0),请求可以有好几行组成,后跟一个空行标示请求结束,完全请求的第一行包括一个命令(get仅是其中一个),所需要的页面和协议/版本,接下来的行包含RFC822头部。表5-1为内置的Http方法:
表5-1 内置的Http有关方法
方法 get head put post delete link unlink 描 述 请求读一个万维网页 请求读一个万维网页的头 请求存储一个万维网页 附加一个命名的资源 删除万维网页 连接两个已有资源 切断两个已有资源间的连接 (1) Get方法请求服务器发送一页面(更一般的情况指一个对象),页面以Mime合适的编码。如果get请求后面跟有一个If-Modified-Since头部,则仅当数据在提供的日期以后被修改过时服务器才发送它。使用这一机制,当要求浏览器显示一缓存的页面时,能带有条件的向服务器请求这一页,并给出与这一页相关的修改时间。如果缓存的页面还有效,服务器仅发送回一状态行宣布这一事实,这样便消除了重传一页的开销。
(2) head方法仅要求消息的头部,而非真实的一页。这一方法可用来得到该页上的一次修改时间,以便为索引的目的收集或测试URL的有效性。没有带条件的head请求。
(3) put方法与get相反:不是读取一页,而是写入一页。这一方法使得建立位于远程服务器上的万维网页面的集合成为可能,请求体中包含这一页面,它可以用MIME编码。这种情况下,put后的一行可能包含ContentType和鉴别头部,以证明调用者的确允许执行请求操作。
(4) 与put相似的是post方法,它也带有url,但不是替换已存在的数据,通常是将新的数据附加在它的后面,象滚动新闻和公告板等。
(5) delete所做的是删除页面。如同put,鉴别和许可在这是重要的角色。 delete的成功与否并没有保证,因为即使远端的Http服务器想要删除页面,但该文件可能有一模式禁止Http服务器修改或删除它。
(6) link和unlink方法允许在已存在的页面或其它资源之间建立链接。每一个请求得到一个由状态行和可能的附加消息(如:全部或部分页面)组成的应答。状态行可能包含代码200(ok),或任一
28
计算机网络 课程设计指导书
个各种各样的错误代码,如:304 Not Modified,400 Bad Request,401 Unauthorized,403 Forbidden等。
5.2 Web服务器/浏览器如何实现通信 5.2.1 分析请求
(1) Http请求的格式参考教材255页图6-12(a)。在Http 请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的Http版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据。
只要在Web浏览器上输入一个url,浏览器就将基于该url向服务器发送一个get请求,以告诉服务器获取并返回什么资源。对于www.hnust.edu.cn的get请求如下所示:
get / Http/1.1
Host: www.hnust.edu.cn
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive
请求行的第一部分说明了该请求是get请求。该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是Http 1.1版本(另一个可选项是1.0)。那么请求发到哪里去呢?这就是第二行的内容。第2行是请求的第一个首部host。首部host将指出请求的目的地。结合HOST和上一行中的斜杠(/),可以通知服务器请求的是 www.hnust.edu.cn/(Http 1.1才需要使用首部host,而原来的1.0版本则不需要使用)。第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义,并且在每个请求中将自动发送。最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值)。注意,在最后一个首部之后有一个空行。即使不存在请求主体,这个空行也是必需的。
5.2.2 构造响应
Http响应的格式参考教材255页图6-12(b),它与请求的格式十分类似。在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个Http响应的例子:
Http/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT Content-Type: text/html;charset=ISO-8859-1 Content-Length: 122
29