一.什么是http协议
1.1 介绍
HTTP是Hyper Text Transfer Protocol(超文本传输协议),是万维网服务器传输超文本到本地浏览器的协议。是应用层的一种协议,是面向连接,无状态的。基于TCP协议由request请求和response响应组成的,默认端口是80。由于http协议是无状态的,所以两次请求响应之间是没有关联的。
1.2 request
浏览器通过socket套接字向服务器提交请求,常见请求有GET,POST,PUT,DELETE。请求分为请求头和请求体。
1.3 response
Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。
二.HTTP通信
1.1 URL解析
URL包含了查找某个资源的信息,基本格式如下:HTTP://host:port/abs_path,表示HTTP协议来定位网络资源;host表示合法的主机域名或IP地址,port指定一个端口号,缺省80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
例如:输入www.baidu.com;浏览器会自动转换成:HTTP://www.baidu.com/
1.2 数据传输
我们的电脑:
ip:192.168.163.26
子网掩码:255.255.255.0
网关地址:192.168.31.2
DNS地址:8.8.8.8
(1)拿到HTTP://www.baidu.com/后,会去找DNS服务器解析域名,返回一个ip地址,如173.168.26.101。拿到ip会判断两个ip是否是同一子网的,会用子网掩码255.255.255.0分别对两个ip做与运算。很明显,两个ip不是同一子网。
(2)应用层走http协议。这时候会发送一个数据包给路由网关(192.168.31.2),拿到网关ip地址的mac地址。把http请求报文:GET http://173.168.26.101/test HTTP/1.1,上图数据打包到数据包中。
(3)传输层走tcp协议。tcp会随机选取一个发送方的端口,接收方的端口一般是80端口。把应用层数据包封装到tcp包后会加一个tcp头,tcp头就有端口号信息。
(4)网络层走ip协议。把tcp头和tcp数据放到ip数据包中,然后设置一个ip头。ip头有本机和目标机器的IP地址。这里本机IP地址是192.168.163.26,目标IP地址173.168.26.101。由于两个ip不是同一子网,就会通过以太网协议广播到网关中去,通过网关发送出去。
(5)数据链路层走以太网协议。把ip头和ip数据包封装到以太网数据包中,然后加一个以太网头。以太网头有本机网卡mac地址和网关mac地址。如果就是说,数据包超出以太网包1500字节,就需要切包。切包后每个包的ip头会多出一个包序列号。
以太网数据包会通过交换机发送到你的网关192.168.31.2上,通过网关可以发送到其他网关,经过n个网关后发送到173.168.26.101百度服务器。
(6)百度服务器会层层解包,获取到http报文,发送给Tomcat。Tomcat会返回响应,和上面一样的。
三.TCP
1 什么是TCP
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP的全双工模式传输层协议。
2 三次握手
三次握手用于tcp的客户端与服务端连接初始化,同步连接双方的序列号和确认号并交换tcp窗口大小信息。
(1)第一次握手,client 发送 SYN、seq到 server,状态修改为 SYN_SENT等待回复。server 收到,状态改变为 SYN_REVD,并将该请求放入 sync queue 半连接队列队列
(2)第二次握手,server 回复 SYN 、 ACK 给 client。client 收到,状态改变为 ESTABLISHED,并发送 ACK 给 server
(3)第三次握手,server 收到 ACK,状态改变为 ESTABLISHED,将该请求从半连接队列 sync queue 放入全连接队列accept queue
2.1 为什么是三次握手?
1.因为如果说客户端第一次握手卡住了,服务端没收到。然后又重新三次握手建立的连接。
2.卡住的第一次握手又发送给了服务端,服务端就会第二次握手,这个时候服务端发送资源给客户端。结果客户端不会管这个第二次握手,因为已经建立了连接。
3.如果是三次握手,那么客户端会发现第二次握手不正常,就会发个复位报文过去,让服务端撤销资源。至于4次5次就没必要了。
3 四次挥手
(1)第一次挥手,客户端发送报文,FIN=1,seq=u,客户端处于FIN_WAIT-1状态。
(2)第二次挥手,服务端收到报文,服务端进入CLOSE_WAIT状态,返回一个报文,ACK=1,ack=u+1,seq=v。客户端收到报文进入FIN-WAIT-2状态。此时,客户端到服务端的连接释放。
(3)第三次挥手,服务端发送连接释放报文,FIN=1,ack=u+1,seq=w,服务端进入LAST-ACK状态等待最后确认。
(4)第四次挥手,客户端收到连接释放报文,发送应答报文,ACK=1,ack=w+1,seq=u+1,进入TIME_WAIT状态,等客户端进入CLOSED状态,服务端收到报文后进入CLOSED状态。