传书层:
向用户提供可靠的端到端(End-to-End)的服务;
传输层向高层屏蔽了下层数据通信的细节
应用程层:
为软件提供了很低服务;
构建于TCP协议之上;
屏蔽网络传输相关细节;
1.2http协议历史:
HTTP/0.9 :
只有一个命令GET;
没有HEADER等描述数据信息;
服务器发送完毕关闭TCP请求;
HTTP/1.0:
增加了很多命令;
增加了status code和header;
多字符集支持、多部分发送、权限、缓存等.
HTTP/1.1:
持久链接,不过成本比较高.
pipeline;同一个链接发送对个请求.
增加了 host和其他的一些命令.
HTTP2:
所有数据以二进制传输;
同一个链接里面发送读个请求不在需要按照顺序来;
头信息压缩以及推送等提高效率的功能
2.1HTTP协议的三次握手
如图:下面试三次握手的示意图:
过程:
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
下图是通过抓包工具看到的是实例:
第一次握手:192.168.31.25发送位码syn=1,seq=x;(一般x=0)到192.97.163.224,192.97.163.224由SYN=1知道192.168.31.25要求建立联机;
第二次握手:192.97.163.224收到请求后要确认联机信息,向192.168.31.25发送ack ,syn=1,ack=1,
第三次握手:192.168.31.25收到后检查ack number是否正确,即第一次发送的位码ack是否为1,若正确,192.97.163.224会再发送ack ,ack=1,192.168.31.25收到后确认seq=seq+1,ack=1则连接建立成功
2.2 UTI URL URN 的联系与区别
Uniform Resource Identifier/统一资源标志;用来唯一标识互联网上的信息资源.
包括URL和URN;
Uniform Resource Locator/统一资源定位器;
URN /永久统一资源定位符,资源移动之后依旧能找到;
2.3 HTTP报文
如图下面所示:
请求报文:它会向Web服务器请求一个动作;
请求报文的格式:
起始行: <method> <request-URL> <version>
头部: <headers>
主体: <entity-body>
响应报文:它会将请求的结果返回给客户端。
响应报文的格式:
起始行: <version> <status> <reason-phrase>
头部: <headers>
主体: <entity-body>
1、方式(method):客户端希望服务器对资源执行的动作,是一个单独的词,比如,GET、POST或HEAD;
2、请求URL(request-URL):要直接与服务器进行对话,只要请求URL是资源的绝对路径就可以了,服务器可以假定自己是URL的主机/端口;
3、版本(version):报文所使用的HTTP版本。其格式:HTTP/<主要版本号>.<次要版本号>;
4、状态码(status-code):状态码是三位数字,描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(比如,“成功”、“出错”等等);
5、原因短语(reason-phrase):数字状态码的可读版本,包含行终止序列之前的所有文本。原因短语只对人类有意义,因此,尽管响应行HTTP/1.0 200 NOT OK和HTTP/1.0 200 OK中原因短语的含义不同,但同样都会被当作成功指示处理;
6、头部(header):可以有零个或多个头部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF首部是由一个空行(CRLF)结束的,表示了头部列表的结束和实体主体部分的开始;
7、实体的主体部分(entity-body):实体的主体部分包含一个由任意数据组成的数据块,并不是所有的报文都包含实体的主体部分,有时,报文只是以一个CRLF结束。
2.4关于HTTP请求GET和POST的区别
1.GET提交,请求的数据会附在URL之后;POST提交:把提交的数据放置在是HTTP包的包体<request-body>中,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变;
2.传输数据的大小: GET:特定浏览器和服务器对URL长度有限制; POST:由于不是通过URL传值,理论上数据不受限.
3.安全性:POST的安全性要比GET的安全性高
HTTP方法:
用来定义资源的操作;
常用的GET POST等;
2.5HTTP CODE:
定义服务器对请求的处理结果;
各个区间的CODE有各自的语义;
状态码:HTTP状态码被分成了五大类。状态码为客户端提供了一种理解事务处理结果的便捷方式。
1、100~199(信息性状态码):HTTP/1.1向协议中引入了信息性状态码
2、200~299(成功状态码):客户端发起请求时,这些请求通常都是成功的。服务器有一组用来表示成功的状态码,分别对应于不同类型的请求
3、300~399(重定向状态码):重定向状态码要么告知客户端使用替代位置来访问他们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容
4、400~499(客户端错误状态码):有时客户端会发送一些服务器无法处理的东西。浏览网页时,我们都看到过臭名昭著的404 Not Found错误码,这只是服务器在告诉我们,它对我们请求的资源一无所知
5、500~599(服务器错误状态码):有时客户端发送了一条有效请求,服务器自身却出错了,这些会返回5xx状态码
2.6 创建一个最简单的web服务;
1:安装node;在命令行输入 node-v 查看当前node版本;
2: const http =require('http');
3 http.createServer(function(request,response){
response.end('123')
}).listen(80)
4:通过 node http.js开启服务;
5:通过在地址输入localhost:80;开启访问;