1、什么是协议
网络协议是计算机之间为了实现网络通信而达成的一种“约定”或者”规则“,有了这种”约定“,不同厂商的生产设备,以及不同操作系统组成的计算机之间,就可以实现通信。
2、什么是http协议
HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol。它是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。它是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
HTPP有多个版本,目前广泛使用的是HTTP/1.1版本。 版本如:HTTP1.0,HTTP1.1,HTTP2.0
关于HTTP版本2.0
HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),简称为h2(基于TLS/1.2或以上版本的加密连接)或h2c(非加密连接),是HTTP协议的的第二个主要版本,使用于万维网。
HTTP/2是HTTP协议自1999年HTTP 1.1发布后的首个更新,主要基于SPDY协议。它由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。
HTTP/2标准于2015年5月以RFC 7540正式发表。HTTP/2的标准化工作由Chrome、Opera、Firefox、Internet Explorer 11、Safari、Amazon Silk及Edge等浏览器提供支持。
多数主流浏览器已经在2015年底支持了该协议。此外,根据W3Techs的数据,截至2019年6月,全球有36.5%的网站支持了HTTP/2。
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
备注
http基于请求和响应模型
必须先有请求才能响应请求和响应成对出现简单快捷(传输格式简单)HTTP三点注意事项:
HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。HTTP在 应用层 交互数据的方式——报文;
HTTP的报文分为:请求报文 + 响应报文
验证: 第一步,我们简单编写一个http服务器如下:
package SocketProgram; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 模拟创建自己的http服务器 */ public class Practice4_MyBrowser_Server { public static void main(String[] args) throws IOException { System.out.println("服务器启动!"); ServerSocket ss = new ServerSocket(9090);//服务器端口 Socket s = ss.accept(); System.out.println(s.getInetAddress()+"..连接!"); InputStream in = s.getInputStream(); byte []bytes = new byte[1024]; int len = in.read(bytes); //将请求信息都打印出来 System.out.println(new String(bytes,0,len)); PrintWriter pw = new PrintWriter( s.getOutputStream(), true); //给客户端反馈信息 pw.println("<html>" + "<font color='red' size='7'>这是简单模拟的服务器程序,作者LH</font>" + "</html>"); s.close(); ss.close(); } }第二步,现在运行服务器: 第三步,打开微软浏览器,往主机localhost的9090端口发送请求: 得到了我们写的服务器响应,是乱码,查看元数据:
第四步,回到IDEA,看:
验证 第一步,模仿浏览器发送请求的格式,编写一个客户端程序:
package SocketProgram; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; /** * 既然我们知道了浏览器是如何发送请求的,那我们可以模拟这个请求 * 创建一个自己的浏览器。 * 访问的网页是:"www.icourse163.org"; * */ public class Practice4_MyBrowser_Client { public static void main(String[]args) throws IOException { Socket s = new Socket(); String hostname = "www.icourse163.org"; SocketAddress address = new InetSocketAddress(hostname,80); s.connect(address); //发送请求,按照http的格式 PrintWriter pw = new PrintWriter(s.getOutputStream(),true); pw.println("GET /channel/2001.htm HTTP/1.1"); pw.println("Host: "+hostname+":80 "); pw.println("Connection: keep-alive"); pw.println("Upgrade-Insecure-Requests: 1"); pw.println("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"); pw.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9," + "image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); pw.println("Accept-Encoding: gzip, deflate, br"); pw.println("Accept-Language: zh-CN,zh;q=0.9,en;q=0.8"); //注意加一个空行 pw.println(); //将接收到的数据打印出来。 InputStream in = s.getInputStream(); byte[]bytes = new byte[1024]; int len; while((len=in.read(bytes))!=-1){ //将响应得到的数据都打印出来下来 System.out.println(new String(bytes,0,len)); } s.close(); } }第二步,运行程序,观察输出:
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code。
下面是常见的HTTP状态码:
200 - 请求成功301 - 资源(网页等)被永久转移到其它URL404 - 请求的资源(网页等)不存在500 - 内部服务器错误Content-Type(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。
Content-Type 标头告诉客户端实际返回的内容的内容类型。
红色代表已经激活记录了。 这个时候访问网址,如www.baidu.com,按下enter即可显示
关于HTTP/2和HTTP1的比较
加s的是加密的,http是没加密的。 一图解决