HTTP协议介绍:
绝大多数的Web开发,都是构建在Http协议之上的Web应用,理解和掌握Http协议,将有助于我们更好的学习和掌握Servlet和Jsp技术,以及其他相关的Web开发技术。
网络基础知识:
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
ISO/OSI(Open System Interconnection)七层参考模型:应用层(处理网络应用)、表示层(数据表示)、会话层(主机间通信)、传输层(端到端的连接)、网络层(寻址和最短路径)、数据链路层(介质访问(接入))、物理层(二进制传输)
OSI各层所使用的协议:
应用层:远程登录协议Telnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3等。
传输层:传输控制协议TCP(Transfer Control Protocol,面向连接的可靠的传输协议,类比打电话)、用户数据报协议UDP(User Datagram Protocol无连接的,不可靠的传输协议,类比写信)。
TCP和UDP的比较:
那么问题来了,既然有了保证可靠传输的TCP协议,为什么还需要非可靠传输的UDP协议呢?
主要原因有二:
端口:在互联网上传输的数据都包含有用来识别目的地的IP地址和端口号。IP地址用来标识网络上的计算机,而端口号用来指明该计算机上的应用程序,端口使用一个16位的数字来表示,范围从0~65535,1024以下的端口号保留给预定义的服务。例如:http使用80端口,比如访问百度的时候可以在www.baidu.com后面加一个':80',而加上':81',访问就失败了。
数据封装:一台计算机要发送数据到另一台计算机,数据首先必须打包,打包的过程称为封装。封装就是在数据前面加上特定的协议头部。
TCP/IP模型:
TCP/IP起源于美国国防部高级研究规划署(DARPA)的一项计划——实现若干台主机的相互通信,现在TCP/IP已称为Internet上通信工业标准,TCP/IP模型包括四个层次:应用层、传输层、网络层、网络接口。
TCP/IP与OSI参考模型的对应关系如下:
HTTP协议:
Http(Hypertext Transfer Protocol)超文本传输协议,是现今WWW上应用得最多的协议,目前的版本为1.1;Http是应用层协议,当你上网浏览网页的时候,浏览器和服务器之间就会通过Http在Internet上进行数据的发送和接收;http是一个基于请求/响应模式的,无状态的协议(request/response based,stateless protocol)
浏览器与服务器通信的过程(HTTP1.0):客户发起连接;客户发送请求;服务器响应请求;服务器关闭连接
持续连接(Persistent Connections):
一个Web站点每天可能要接收上百万的用户请求,为了提高系统效率,HTTP1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。但是,这也造成了一些性能上的缺陷,例如,一个包含有许多图像的网页文件中并没有包含真正的图像数据内容,而只是指明了这些图像的URL地址,当Web浏览器访问这个网页文件时,浏览器首先由发出针对该网页文件的请求,当浏览器解析Web服务器返回的该网页文档中的HTML内容时,发现其中的<img>图像标签后,浏览器根据<img>标签中的src属性所指定的URL地址再次向服务器发出下载图像数据的请求。
下面通过图示的方式对这两种协议进行区分:
HTTP URL:
格式:http://host[:port][abs_path]
其中http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或IP地址(以点分十进制格式表示);port用于指定一个端口号,拥有被请求资源的服务器主机监听该端口的TCP连接。如果port为空,则使用缺省的端口80;abs_path指定请求资源的URI(Uniform Resource Identifier,统一资源标识符),如果URL中没有给出abs_path,那么当它作为请求URI时,必须以"/"的形式给出。通常这个工作浏览器就帮我们完成了。
HTTP请求:
客户端通过发送HTTP请求向服务器请求对资源的访问。HTTP请求由三部分组成,分别是:请求行,消息报头,请求正文。
请求行以一个方法符号开头,后面跟着请求URI和协议的版本,以CRLF(回车换行)作为结尾。请求行以空格分隔,除了作为结尾的CRLF外,不允许出现单独的CR或LF字符,格式如下
Method Request-URI HTTP-Version CRLF
其中Method表示请求的方法,Request-URI是一个统一资源标识符,标识了要请求的资源,HTTP-Version表示请求的HTTP协议版本,CRLF表示回车换行。例如:
GET /test.html HTTP/1.1 (CRLF)
下面是HTTP请求的常见方法:
POST /login.jsp HTTP/1.1 (CRLF) Accept:image/gif (CRLF) (....) Host:www.sample.com (CRLF) (....) .... Cache-Control:no=cache (CRLF) (CRLF) username=hello&password=123456
当我们在HTML中提交表单时,浏览器会根据你的提交方法是GET还是POST,采用相应的在HTTP协议中的GET或POST方法,向服务器发出请求。
HTTP响应:
在接受和解释请求消息后,服务器会返回一个HTTP响应消息,与HTTP请求类似,HTTP响应也是由三个部分组成,分别是:状态行,消息报头,响应正文
状态代码与状态描述如下:
程序员最常见的是200,404,500。
HTTP消息:
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和相应消息都是由开始行,消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行
由于HTTP协议与TELNET协议都是基于TCP协议,我们可以用Telnet来做个实验,环境:windows操作系统(xp默认开启了Telnet,而win7需要配置一下,在"控制面板" 一〉"程序卸载" 一〉"打开或关闭windows功能",在里面你可以看到许多服务项,选择"telnet服务器"和"telnet客户端"确定即可)。
操作步骤:
下面是相关的信息:
HTTP/1.1 200 OK Content-Type: text/html Content-Length: 238608 Connection: close Date: Wed, 01 Jul 2015 02:52:35 GMT Server: SWS Vary: Accept-Encoding Cache-Control: no-transform, max-age=300 Expires: Wed, 01 Jul 2015 02:57:35 GMT Last-Modified: Mon, 24 Mar 2008 02:24:46 GMT X-RS: 11888092.21063142.13937768 FSS-Cache: HIT from 9528760.16344514.11578400 Accept-Ranges: bytes
可以清楚地看到它的连接属性是close。
下面我们用Apache-tomcat做个实验,使得本机称为一个web服务器。下载tomcat解压缩,双击解压目录下的bin目录下的批处理文件startup.bat,即可启动tomcat(前提是已经安装完了JDK,并且在攻击系统设置里面配置环境变量:新建一个变量JAVA_HOME,值为JDK的安装根目录;配置path,在前面添加一个JDK安装目录下的bin目录的路径)。在本机浏览器中输入localhost:8080,就可以访问本机服务器。下面我们还是用telnet远程访问该服务器:
当然我们可以指定连接属性,比如:
GET / HTTP/1.1 Host: localhost Connection:Keep-Alive 或者 HEAD / HTTP/1.1 Host: localhost Connection: close
这里的关键就是理解Keep-Alive与close之间的区别,HTTP1.1默认连接属性就是Keep-Alive,而HTTP1.0连接属性只有close。
下面是关于HTML(超文本标记语言)的相关介绍:
表单的HTML标签主要有:Text,Textarea,Radio,Checkbox,Select,File,Hidden,Submit,Reset,Button等等。
下面是在DreamWeaver写的代码,我添加了详细得注释信息,通过这些代码应该可以快速地掌握这部分内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <!--表单的使用--> <form> 用户名:<input type = "text" size = "40"> <br><!--文本框Text,默认长度为20--> 密码:<input type = "password"><br> 性别:<input type = "radio" name = "sex">男 <!--单选按钮Radio,不指定name属性的话两个按钮都无法选中,但是如果想要出现互斥现象的话,一个组里的name属性必须相同--> <input type = "radio" name = "sex">女<!----> <br> 年龄:<input type = "radio" name = "age">大于20 <input type = "radio" name = "age">小于20 <br> 兴趣:<input type = "checkbox">足球<!--多选按钮Checkbox--> <input type = "checkbox">篮球 <input type = "checkbox">排球 <br /> <!--下列列表Select--> 城市: <select> <option>日照</option> <option>济南</option> <option>青岛</option> <option>滨州</option> </select> <br> 文件:<input type = "file"><!--文件File:选择本机文件上传--><br> 说明:<textarea></textarea><!--文本区域Textarea--> <br> <!--三个按钮Submit:提交到服务器端,Reset:客户端的行为,Button:普通按钮,一般用于javascript脚本--> <input type = "submit" value = "提交"> <input type = "reset" value = "清空"> <input type = "button" value = "按钮" onclick = "javascript:alert('hello')"><!--点击按钮弹出“hello”对话框--> </form> <!--表格的使用--> <table border = "1" width = "80%" align = "center"> <!--表格,不指定border属性的话,默认没有边框;width属性可以直接指定宽度,也可以以百分比的形式指定,代表它占据浏览器显示页面宽度的百度比;align属性表示对其方式,默认左对齐--> <tr><!--tr表示一行--> <td colspan = "2"><!--td表示一列,colspan属性指定占据几列--> 山东 </td> </tr> <td> 天津 </td> <td> 河北 </td> <tr> </tr> </table> <!--超链接的使用--> <a href = "http://www.baidu.com" target="_blank"> 百度一下 </a> </body> </html>