1.HTTP概述
HTTP 超文本传输协议。
当我们访问一个网站时,需要通过统一资源定位符(uniform
resource locator,URL)来定位服务器并获取资源。
<协议>://<域名>:<端口>/<路径>
一个 URL 的一般形式通常如上所示( http://test.com/index.html
),现在最常用的协议就是 HTTP,HTTP 的默认端口是 80,通常
可以省略。
在浏览器输入 URL 后获取 HTML 页面的过程。
-
在浏览器输入地址。
-
域名解析。
也就是通过dns服务器,使我们能获取到域名背后的ip地
址。 -
浏览器向web服务器发送一个HTTP请求(打包http报文)
浏览器将张三访问百度的请求打包成http报文,然后浏览器
将这份报文和百度服务器的ip交给tcp进程。tcp进程虽然知
道了目的Ip地址,但是觉得不安全,不敢发出去,他觉得先
发个ip包看看能不能收到比较好一点儿,于是有了第三步,
TCP[三次握手] -
http触发TCP进程三次握手连接
-
TCP传输HTTP
这一步TCP真正开始传输数据了。 -
目标服务器接收到 HTTP 请求并处理。
-
目标服务器往浏览器发回 HTTP 响应(比如:服务器回传自身网
页)。 -
浏览器解析并渲染页面。
-
释放TCP连接(四次挥手)
2.tcp
2.1三次握手
建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连
接的建立, 在Socket编程中,这一过程由客户端执行connect来触
发,具体流程图如下:
- 第一次握手:Client将标志位SYN置为1,随机产生一个值
seq=J,并将该数据包发送给Server, Client进入SYN_SENT状
态,等待Server确认。 - 第二次握手:Server收到数据包后由标志位SYN=1知道Client请
求建立连接,Server将标志位 SYN和ACK都置为1,ack=J+1,
随机产生一个值seq=K,并将该数据包发送给Client以确认连接
请求 ,Server进入SYN_RCVD状态。 - 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否
为1,如果正确则将标志位ACK 置为1,ack=K+1,并将该数据
包发送给Server,Server检查ack是否为K+1,ACK是否为1,
如果正确则 连接建立成功,Client和Server进入
ESTABLISHED([ɪˈstæblɪʃt])状态,完成三次握手,随后Client与
Server之间可以 开始传输数据了。
举例说明
2.2 四次挥手:
TCP断开链接的过程和建立链接的过程比较类似,只不过中间的两部并不总是会合成一步走,所以它分成了4个动作,张三挥手,表示我要走了(clien发送了一个fin)——李四伤感地微笑,表示我知道了(server发送了一个ack),但是上句还没说完,还可以继续说(也就是服务端处于closewait状态)——李四挥手(服务端发送fin,表示我也不说了,服务端处于last_asc状态)——张三伤感地微笑(发送ack给服务端,client处于time_wait状态,服务端处于关闭状态)。
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的
数据传送,Client进入 FIN_WAIT_1状态 - 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认
序号为收到序号+1(与SYN相同, 一个FIN占用一个序号),
Server进入CLOSE_WAIT状态。 - 第三次挥手:Server发送一个FIN,用来关闭Server到Client的
数据传送,Server进入LAST_ACK 状态。 - 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,
接着发送一个ACK给Server,确认序号为收到序号+1,Server
进入CLOSED状态,完成四次挥手。 另外也可能是同时发起主
动关闭的情况: