其实,发起一个HTTP请求,本质上就是建立一个Socket连接
只是HTTP只是一个协议,因而,在使用outputStream.write写的二进制数据格式要符合HTTP。
步骤
- 浏览器建立Socket前,根据地址栏输入的URL的域名DNS解析出IP地址
- 根据IP地址和默认的80端口与远程服务器建立Socket连接
- 浏览器根据URL组装成一个get类型的HTTP请求头,通过outputStream.write发送到目标服务器
- 服务器等待inputStream.read返回数据
- 断开连接
HTTP和Socket的关系
-
Socket
又称为套接字,是操作系统提供给应用程序进行网络通信的抽象API,不是协议,这里的socket指的是http socket, 由IP+Port组成,IP涉及主机到主机,对应网络层;Port涉及TCP/UDP,应用对应用,对应传输层
这意味着,可以使用socket开发基于TCP、UDP等的应用
linux系统中还有一种socket称之为unix domain socket,是通过本地文件进行进程间通信的方式
-
HTTP
基于TCP的应用层协议,虽然TCP是支持长连接(而Socket与连接的长短没有关系,真正相关的是TCP)的,但是HTTP并不强制要求长连接。
大部分情况下,一次HTTP请求的完成经过如下:
建立TCP连接(可以使用Socket)->客户端发送报文->服务端返回报文->服务端或客户端关闭此连接
这个过程,由于每次都要建立连接,并在完成一次请求响应后关闭连接,所以大家称为“短连接”。
HTTP的所谓Keep-Alive,实际上是一种不可控的行为,是为了在一定程度上改善HTTP性能的,即服务端和客户端希望不立刻断开连接,这样下次发送数据时就不需要建立TCP连接了,但是服务端和客户端的任何一方都可以随时断开。
网友评论