计算机网络实验报告班级:电信0901学号:U200914332姓名:王焕2012.1实验四:网络协议与Web通信一、实验目的1.了解网络协议数据单元的格式2.分析网络协议工作基本流程3.深入理解Web应用的通信过程二、实验内容1.网络协议数据单元分析通过wireshark抓取局域网数据包并分析各个层次的协议数据单元内容(1)以太网帧头(2)IP分组首部(3)ARP包(4)ICMP包(ping)2.Web原理实验(1)HTTP协议分析(2)通过socket编程模拟HTTP协议通信过程三、实验原理1.Web通信经过四个步骤:(1)建立连接(2)客户端发送HTTP REQUEST请求(3)服务器端接收请求,生成RESPONSE响应(4)关闭连接2.HTTP协议客户端浏览器或其他程序与Web服务器之间的应用层通信协议。
一般在Internet 上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。
3.Java网络编程Java Socket对网络的封装是非常完美的,对于进行网络编程的程序员,使用网络就像使用本地文件系统一样简单。
与其他Socket网络编程有一个明显的区别就是,在服务器和客户机通信建立时就要另外一个ServerSocket 。
它仅仅适用与服务器端,监听指定端口,如果有socket 连接请求,它就答应,并在服务器端产生一个socket 与其对应,那么用这个socket 就可以和客户端进行通信了。
实验原理图如下:四、实验内容及分析1.编译、执行参考程序本次实验提供了两个原始程序(NetServer.java和NetClient.java),它们可以实现一个服务器/客户端请求响应的完整过程。
Dos环境下先后编译执行NetServer.java与NetClient.java,即可得到一次完整的客户端向服务器请求并得到响应的完整过程,结果如下:2.修改、编写实验程序参考程序模拟了客户端与服务器之间的对话,但由于其之间交互的数据都是我们设定的而不含有http报头信息,因此不能和真正的web服务器与浏览器对话,以下即为实现自制web服务器的方法(1)利用自制的服务器获取真正浏览器的HTTP Request 报头信息:运行自制的服务器,默认监听端口8080,在浏览器中输入以下网址http://127.0.0.1:8080/new/main/UserLoad.jsp,其中127.0.0.1为本机localhost地址,这样浏览器就会向自制服务器发出请求,服务器即可获取http request报头信息。
如图所示:(2)利用自制的客户端获取HTTP Response 报头信息:在真实的浏览器中访问一网址,利用wireshark软件获取对该网站服务器发送的http request报头,将这些内容加入NetClient.java中out.println()方法中的字符串内,如下所示:out.println("GET / HTTP/1.1\r\n");out.println("Host: \r\n");out.println("Connection: keep-alive\r\n");out.println("Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");out.println("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)AppleWebKit/534.8 (KHTML, like Gecko) Chrome/7.0.524.0Safari/534.8\r\n");out.println("Accept-Encoding: gzip,deflate,sdch\r\n");out.println("Accept-Language: zh-CN,zh;q=0.8\r\n");out.println("Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3\r\n");并且将NetClient.java文件中的端口号PORT改为80,InetAddress.getByName("localhost");中的localhost改为实际访问的网址。
即可得到服务器的http response,如图所示:(3)在自制的服务器中构造一个HTTP Response 报头信息:为将(2)中得到的http response报头信息加入自制服务器中,需在NetServer.java 中加入out.println()语句,位置在String str = in.readLine();之前,http response报头信息放入out.println()方法中的字符串内即可:out.println("HTTP/1.1 200 OK\r\n");out.println("Cache-Control: private, max-age=0\r\n");out.println("Content-Length: 30104\r\n");out.println("Content-Type: text/html; charset=utf-8\r\n");out.println("Set-Cookie: _SS=SID=73C301846E8148399EFF0E23B86DD939;domain=; path=/\r\n");out.println("P3P: CP=\"NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OURIND\"\r\n");out.println("Date: Mon, 02 Jan 2012 16:48:11 GMT\r\n");此外,http response报头还可利用wireshark获取。
(4)通过真正的浏览器来显示自制服务器提供的Web 服务:编译运行经过(3)修改的NetSerer.java程序,在真正的浏览器中输入http://127.0.0.1:8080/new/main/UserLoad.jsp网址,则会出现来自自制服务器的http response报头信息,如图所示:服务器的响应如下:五、实验小结在本次实验中,在java环境中,通过提供的两个原始程序NetServer.java和NetClient.java,熟悉了Web通信中,客户端发出请求、服务器响应的完整流程。
由于web服务器存储的是超文本信息,因而通信需基于http协议,因此实验中实现了利用自制的服务器、客户端获取http request与response信息,乃至自己为自制服务器构造http response报头并与浏览器对话。
在这一过程中,更深入认识了Web 通信中客户端、服务器经http协议传输请求与相应的机制。
另外,Wireshark的数据包捕获与解析功能也为实验中需要的特定http报头信息提供了很大方便。
六、附录1.修改后的客户端程序代码NetClient.javaimport java.io.*;import .*;public class NetClient{public static final int PORT =80;public static void main(String[] args) throws IOException{InetAddress addr = InetAddress.getByName("");Socket socket =new Socket(addr,PORT);try{System.out.println("客户端请求: "+socket);BufferedReader in = newBufferedReader(newInputStreamReader(socket.getInputStream())) ;PrintWriter out = new PrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);out.println("GET / HTTP/1.1\r\n");out.println("Host: \r\n");out.println("Connection: keep-alive\r\n");out.println("Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");out.println("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)AppleWebKit/534.8 (KHTML, like Gecko) Chrome/7.0.524.0Safari/534.8\r\n");out.println("Accept-Encoding: gzip,deflate,sdch\r\n");out.println("Accept-Language: zh-CN,zh;q=0.8\r\n");out.println("Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3\r\n");System.out.println("客户端请求发送完毕...");String str = in.readLine();System.out.println("接收: "+str);while(str!=null){str = in.readLine();System.out.println("接收: "+str);}}finally{System.out.println("客户端关闭...");socket.close();}}}2.修改后的服务器NetServer.java程序代码import java.io.*;import .*;public class NetServer{public static final int PORT =8080;public static void main(String[] args) throws IOException{InetAddress addr = InetAddress.getByName("localhost");ServerSocket s =new ServerSocket(PORT,10,addr);System.out.println("虚拟Web服务器启动: "+s);try{Socket socket =s.accept();try{System.out.println("接受客户端连接请求: "+socket);BufferedReader in = new BufferedReader(newInputStreamReader(socket.getInputStream())) ;PrintWriter out = new PrintWriter(new BufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);out.println("HTTP/1.1 200 OK\r\n");out.println("Cache-Control: private, max-age=0\r\n");out.println("Content-Length: 30104\r\n");out.println("Content-Type: text/html; charset=utf-8\r\n");out.println("Set-Cookie:_SS=SID=73C301846E8148399EFF0E23B86DD939;domain=; path=/\r\n");out.println("P3P: CP=\"NON UNI COM NAV STA LOC CURa DEVaPSAa PSDa OUR IND\"\r\n");out.println("Date: Mon, 02 Jan 2012 16:48:11 GMT\r\n");String str = in.readLine();System.out.println("收到: "+str);while(!str.equals(" ")){str = in.readLine();System.out.println("收到: "+str);}out.println("客户端传送信息服务器已经接收完毕");System.out.println("服务器响应完毕,正在退出...");}finally{System.out.println("服务器关闭...");socket.close();}}Finally{s.close();}}}。