Servlet详解(三)---http请求
一.建立TCP连接:
1.在http工作开始前,需要让Web浏览器与Web服务器连接起来,而只要找到Web服务器的地址就可以完成连接,该功能又TCP来完成,而TCP协议与IP协议共同完成了Internet这个网络系统。HTTP协议是位于运输层(TCP)/网络层(IP)之上的应用层的协议。由于网络中所有上层协议都应该建立在下层协议的基础上。所有要优先于完成TCP连接,当然TCP/IP同样建立在更下层的数据链路层与物理层之上,但是由于不大相关所以就不提了。
2.三次握手
为什么需要三次握手:前两次确保浏览器与服务器之间连接的通畅,第三次防止请求由于一些原因被搁置很久。
三次握手详解:
第一次握手:浏览器先向服务端发送报文,报文中SYN位置设置为1,Sequence Number(序列数字)设置为X。(个人理解SYN是为了防止同一个浏览器向同一个服务端多次请求)
第二次握手:服务端再接收到第一次的报文以后,向浏览器回发报文,SYN同样为1,将Acknowlegment Number(确认数字)设为X+1,并将Sequence Number设置为Y。第一次握手的目的不需要多说,仅仅是个请求,第二次握手的目的在于确保浏览端发送至服务端这条线路是通的。
第三次握手:浏览器再接收到第二次的报文以后,向服务端回发报文,Acknowlegment Number设为Y+1,Sequence Number设置为Z(用于断开TCP连接的四次挥手)。第三次握手的目的并非是确认浏览器到服务器的连接是否通顺,因为这点在第一次握手已经确认了,不然也不会完成第二次握手。第三次握手的目的在于确保请求的即时性,如果第一次握手在由于一些原因请求被搁置,一段时间后才发送至server,而server是无法判断你是否还需要连接的(比如浏览器卡住后,有些人会等待响应,而有些人会关掉浏览器),所以server还是会发送第二次握手,第三次握手的目的在于确认你是否还需要建立连接。如果不需要,则不会发送第三次握手,server也不会继续连接。如果需要则发送第三次。
二、连接成功后,服务端与浏览端的交互
1.浏览器向服务端发送请求命令:包含URL,请求方法(get or post)等信息
2.浏览器向服务端发送请求头部:即Request Headers内部内容
3.服务端应答:与浏览器发送的请求命令相似,应答会发送服务端的自身相关信息,以及被请求文档的相关信息
4.服务端发送应答头部:即Response Headersnei'bu内部内容。
三、请求报文Request
1.请求报文的三个部分及其基本内容:
2.请求行:
请求行主要包括:URL地址,请求方法(主要是doGet与doPost,也有doput,dodelete等),协议的版本(即http版本),请求行后会有换行符标识请求行结束
3.请求头部:
请求头部采用键值对方法,Key与Value之间使用“:”隔开,主要为客户端请求的一些类型,请求头部结束使用回车加换行作为单独一行标识
常见的请求头有
3.请求数据
如果用户是通过url发出访问请求,则不会有请求数据,如果是通过网页提交一些数据则会将这些数据作为键值对存放在请求数据中
四、Response响应
1.响应报文的三个部分及其基本作用
2.状态行:协议版本不用多说,状态码是响应的结果,状态码描述是对状态码的一个简单描述
常见的状态码:
2.响应头部:基本格式与请求头部相同,同样键值对,同样回车换行标识,只是常见的属性不同而已
3.响应数据:
响应数据就是将你请求的网址以html格式发送给客户端。
五、四次挥手
当我们传送数据结束后,需要关闭掉TCP连接,而关闭同样也需要如同握手一般,所以就有了四次挥手:
1.四次挥手可以看成两个部分:第一次挥手和第二次挥手为第一部分,第三次挥手以及第四次挥手看做第二部分,没有明确划分,仅仅是便于理解的说话。
2.第一次挥手:Fin标记主机名,Acknowlegment Number源自三次握手中的Z,Sequence Number作为一个确认码,主要用于告诉服务器,浏览器将停止输出数据。
3.第二次挥手:Acknowlegment Number值为X+1,Sequence Number用来接收Z,主要用于响应第一次挥手,告诉浏览器,服务器收到你的断开请求,请等待服务器的的断开请求,很多人到这里就不明白了,认为第二次挥手后就应该直接关闭。但是这次只能使得浏览器不能发送数据,而服务端依然可以,这违反了TCP的全双工模式(交换机在发送数据的同时也可以接收数据),所以需要第三次第四次挥手再来断开服务器发送数据的能力。
4.第三次挥手:与第一次类似,Fin代表主机名,Acknowlegment Number值为X,Sequence Number顺序码设置为Y,并发送给浏览器,请求浏览器断开服务器发送数据能力。
5.第四次挥手:返回Acknowlegment Number为Y,Sequence Number为X,发送给服务器,并确认断开连接。