Http协议

一、什么是Http协议

超文本传输协议(HTTP,HyperText Transfer Protocol),是一种建立在TCP上的的无状态连接,整个基本的流程是,客户端发送一个HTTP请求,说明客户想要访问的资源和请求动作,服务器接收到请求之后,服务端开始处理请求,并根据请求访问服务端的资源,然后通过htpp响应把结果返回到客户端,一个请求的开始到一个请求的结束称为事务。当一个事务结束后,还会在服务端添加一个日志。

二、HTTP1.0与HTTP1.1的区别

1、http1.0 与服务端建立连接后,每次只能访问一个web资源。
2、http2.0 与服务器建立连接后,每次可以访问多个web资源。

三、HTTP请求

HTTP请求是客户端往服务端发送请求,告知服务器自己的要求。

客户端连上服务端之后,向服务端请求了一个web资源就叫做一个http请求。

HTTP请求由请求头,状态行,请求体三个部分组成。

状态行:包括请求方式Method,资源路径URL,协议版本Version;

请求头:包括访问的域名,用户代理,cookie登信息

请求体:就是HTTP请求的数据

HTTP请求:

1、状态行

状态行中的GET表明就是请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT。常用的请求方式为POST和GET。
用户如果没有设置,那么默认都是以GET方式来请求,比如在网上点击的超链接等等。

GET与POST的区别.
传输数据大小的区别:
GET:请求的数据容量比较小一般不超过1k,谷歌浏览器限制请求的url长度是8182个字符.
POST:请求的数据容量没有限制,Tomcat下默认为2M,可以取消Tomcat的限制。在conf->server.xml中取消
提交方式的区别:
GET:直接在地址栏中提交到服务端.不安全
POST:提交的数据在消息主体中,不再地址栏中直接显示比较安全。

2、请求头

Accept:告诉服务端它所支持的数据类型
Accept-Encoding:告诉服务端所支持的压缩格式
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
Connection:告诉服务端请求后是断开连接还是保持连接

三、HTTP响应

服务器收到客户端发来的HTTP请求后,根据HTTP请求的动作要求,服务器做出具体的动作,将结果回应给客户端,称为HTTP响应。
HTTP响应由三部分组成:状态行,响应头,响应正文

状态行:包括协议版本Version 状态码 Status Code,回应短语
响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式登信息
响应正文:响应的具体数据

HTTP响应:

1、状态行:

HTTP版本号 +状态码

常见状态码的含义

        200---OK/请求已经正常处理完毕

        301---/请求永久重定向

        302---/请求临时重定向

        304---/请求被重定向到客户端本地缓存

        400---/客户端请求存在语法错误

        401---/客户端请求没有经过授权

        403---/客户端的请求被服务器拒绝,一般为客户端没有访问权限

        404---/客户端请求的URL在服务端不存在

        500---/服务端永久错误

        503---/服务端发生临时错误

2、常用的响应头:

Content-Type:服务端返回数据的类型
Accept-Ranges:
ETag:与Accept_Ranges来实现断点续传
Date:响应的时间
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式

四、TCP/IP三次握手与四次握手总结。

 在学习握手之前我们先看一下TCP首部报文格式:

  • 源,目标端口号字段:各占16bite。TCP协议通过使用"端口"来标识源端口与目标端口的应用进程。端口号可以使用0到2^16之间的任何数字,在收到服务请求时,操作系统会动态的为客户端的应用程序分配端口号,在服务器端,每种服务在"众所周知的端口",为用户提供服务。
  • 序列号字段:占32bite。用来标识从TCP源端口向TCP目标端口发送的数据字节流,它表示在这个保文段中的第一个数据字节。
  • 确认序号字段:占32bite。只有当ACK标志为1的时候才有效。它包含目标端期望收到源端的下一个数据字节。
  • 首部长度:占4bite。给出占32bite的数目。没有任何选项字段的TCP首部长度为20字节。最多可以有60字节的TCP头部。
  • 保留位:以后使用
  • 标志位字段(URG,ACK,PSH,RST,SYN,FIN),占6bite,含义如下
  1. URG:当URG为1时,表示紧急指针字段有效,告诉系统保文中含有紧急数据
  2. ACK:当ACK为1时,确认序号字段有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
  3. PSH:当PSH为1时,交互式通信,一端的应用进程希望在键入命令后立即受到对方的响应。接收方应当尽快将报文段交给应用层
  4. RST:当RST为1时,复位,(TCP连接中出现错误)。
  5. SYN(发起一个连接,连接建立时,用来同步序号):当SYN=1,ACK=1连接请求报文,对方如果同意响应报文使SYN=1,ACK=1.
  6. FIN:释放连接,发送完毕。
  • 窗口:占16bite,通知接受方,需要多大的空间来接受本条报文。
  • 检验和:占16bite,用来检验首部和数据这两部分。
  • 紧急指针:占16bite,用来指出该报文中紧急数据的长度
  • 选项:占32bite,用来定义可变参数。

 

TCP的三次握手

三次握手

流程:

  1. 首先服务器端先创建TCB模块(传输控制块),时刻准备接受客户进程的连接请求,此时的服务器端进入LISTEN(监听转态)
  2. 客户端主动创建TCB模块,然后向服务器端发起连接请求报文,该报文段的SYN为1.同时选择一个初始序列号seq=x。此时客户端进入SYN-SET(同步已发送状态)。TCP规定:SYN报文段不能携带数据,但是需要消耗一个序列号。
  3. 服务端接受到连接请求如果同意连接的话,那么会发送确认报文给客户端。该报文段的SYN=1,ACK=1,确认号为ack=x+1,同时自己需要初始化一个序列号seq=y。此时服务端进入SYN-RCVD(同步收到状态)。TCP规定:不能携带数据但是要消耗掉一个序列号
  4. 客户端的进程收到服务端的确认报文后,还会向服务端发送确认报文。该报文段的ACK=1,seq=x+1,ack=y+1.此时客户端进入ESTABLISHED(建立连接转态)。
  5. 当服务端收到客户端的确认报文后,也进入ESTABLISHED状态,此时便开始传输数据了。

 

为什么最后客户端还要发送一次确认报文呢。

我们可能会这样想,为什么不是两次握手我想服务端建立连接,服务器确认后便进入了ESTABLISHED转态,然后客户端收到服务端的确认报文后,便也进入建立连接的转态,然后双方便开始数据传输。还是因为安全问题,这样想有这样的一种情况,我们第一次向服务端发送连接请求但是呢,由于网络阻塞没有能够及时的到达服务端,这个请求被滞留了,但是后来网络通畅的我们又向服务端发送了一次请求成功并且关闭了。这时,之前滞留的那个请求到了服务端,然后服务端就进入了建立连接的转态,但是确认报文的时候,返回到客户端,此时我们的客户端已经不需要了建立连接了。这时服务端就会处于建立连接的转态,并且没有手段取消,这样就造成了不必要的浪费。

TCP的四次握手:

首先我们知道的是客户端与服务端都可以释放连接,在释放之前双方都是处于ESTABLISHED状态的,然后客户端主动关闭,服务端被动关闭。

å次æ¥æ

  1. 首先客户端发送释放连接报文,与此同时客户端停止发送数据,释放数据报文首部FIN=1,其序列号seq=m(等于前面服务端最后传递过来的数据的最后一个字节的序列加上1),此时客户端进入FIN-WAIT_1(终止等待的1阶段)。同样FIN报文段不可以携带数据,但需要消耗一个序列号。
  2. 服务端接收到客户端的释放连接的报文后,向客户端发送确认报文,确认报文首部,ACK=1,ack=m+1,并且带上自己的序列号seq=n。此时TCP服务器通知高层应用,客户端向服务端的传输连接已经关闭,但是服务端任然可以向客户端发送数据。这个状态需要持续一段时间,也就是服务端处于CLOSE-WAIT(关闭等待状态)的时间。
  3. 客户端在接收到服务端的确认报文后,便进入了FIN-WAIT_2(终止等待的2阶段)。等待服务端发送释放连接的报文(这段时间还可以接收服务端发过来的数据)。
  4. 服务端在把自己需要发送的数据发送完毕后,便向客户端发送释放连接报文,该报文段的首部FIN=1,ACK=1,seq=w(因为服务器可能有发送了一些数据到客户端,所以假设为w(最后一个字节的序列加上1)),ack=m+1。此时服务端进入LAST-ASK(最后确认状态)。
  5. 客户端在接收到服务端发来的释放连接报文后,再向服务端发送确认报文,该报文段的首部ACK=1,seq=m+1,ack=w+1,此时客户端进入了TIME-WAIT状态(时间等待),这里并没有撤销TCB模块,还需要等待2*MSL的时间后,当撤销TCB模块后才会进入CLOSED状态。
  6. 服务端只要收到了客户端的确认报文就会立即进入CLOSED状态。

为什么客户端要等待2*MSL的时间呢?

1、保证TCP协议的全双工连接能够可靠关闭

2、保证这个连接的重复数据段在网络消失

  • 为什么保证全双工连接可靠关闭,我们假设客户端是直接进入CLOSED状态,我们客户端最后需要向服务端发送确认报文,但是这个时候因为某些原因,我们的确认报文没有传到服务端,这时服务端在超时后会再向客户端发送FIN,但是我们的客户端这时已经进入了CLOSED状态,找不到重发FIN对应的连接。这样服务器端就会把错误报告给高层。这样的协议就不是稳定可靠的了。所以客户端不是直接进入CLOSED状态,而是等待2*MSL(客户端可以在这个时间段接收到服务端重发过来了释放报文)。
  • 为什么可以保证连接的重复数据消失,假设这样的一种情况,客户端是直接进入了CLOSED状态,但是我们又向服务端发起了一个连接请求,这样我们的端口号可能会相同。想一下有这样一个情况,我们上次建立连接有可能有的数据滞留在了网络之中,这个时候我们有建立了新的连接,端口号相同,这时滞留的数据网络通畅又传输过来,这时TCP认为这个数据是新的连接的,这样就会导致数据混乱。我们设置2*MSL这个时间段滞留的数据会在网络中消失。这样就不会造成数据混乱。

 

如果在连接时,客户端突然出现了故障应该怎么处理。

TCP中存在一个保活定时器,每次服务端只要接收到客户端传送过来的信息,这个保活定时器就会复位(置零),这时我们的客户端出现故障了,保活定时器计时(大概2小时),服务端还没接收到客户端的消息,这时服务端会向客户端发一组探测报文,每隔大概70分钟,连续发10次,如果还是没有接收到客户端的消息,就会关闭这个连接。

 

五、DNS域名解析

图片来源:《深入分析Java Web技术内幕》

这张图为我们展示了一次完整的DNS解析的过程。

首先我们先了解一下服务器的相关概念:

Local DNS server(本地域名服务器):一般都是给你提供网络服务的单位(电信,移动,学校等单位)。离你不是太远
Root DNS server(根域名服务器):根服务器主要用来管理互联网的主目录。所有根服务器均由美国政府授权的互联网域名与号码分配机构ICANN统一管理,负责全球互联网域名根服务器、域名体系和IP地址等的管理。全世界只有13台根域名服务器。其中10台在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本。(百度百科)
gTLD server(顶级域名服务器):某个国家,或者大型网站(教育,商业等)比如(.cn. com .eu)等.
Name server:一般是你所注册域名的那家域名服务提供商(万网等等)。

TTL:全称为(Time To Live)生存时间,简单的来说就是DNS记录在DNS服务器上的储存时间。

 

当我们在浏览器中输入www.tao.com的时候,DNS大致有十个步骤。

第一步:浏览器会从缓存中查找是否该域名解析的对应的IP地址,如果有那么DNS解析结束。如果没有则继续执行。(域名缓存的时间是通过TTL的属性来进行设置的)

第二步:如果浏览器的缓存中没有找到,那么会在操作系统的缓存中查找是否存在对应的域名解析的结果,windows下载C:\Windows\System32\drivers\etc下查找是否存在。(linux)这两步都是在本地机器上进行的如果都没有查询到,才会向域名服务器发起请求。

第三步:我们的网络配置中可以查看我们的域名解析服务器的地址,windows下在DOS命令行下输入 ipconfig /all可以查看(linux)。前面两个过程无法完成的话,那么操作系统会把这个域名发送给该DNS域名解析服务器,也就是Local DNS Server。一般的DNS域名解析到这里基本上就完成了。

第四步:如果本地的域名服务器的缓存中没有存在该域名解析的IP地址,那么本地服务器会向Root DNS server请求解析。

第五步:RDNS服务器返回给本LDNS一个所要查询的gTLDS(主域名服务器)地址。

第六步:LDNS根据RDNS返回的主域名服务器的地址,对其发送请求。

第七步:gTLD server 返回给本地服务器一个Name server服务器地址。

第八步:LDNS根据gTLDserver返回的Name server服务器地址对其发送请求。

第九步:Name server 会查询储存的域名和IP地址的映射表,并返回给LDNS服务器对应的查询结果和一个TTL的值。

第十步:LDNS 会根据Name server 返回的结果与TTL的值,对结果在本地服务器上进行缓存。然后把结果与TTL的值发送给用户。同样浏览器也会相应的对结果进行缓存。

1、跟踪域名解析的过程。

Windows与Linux下都可以用nslookup来查询域名解析对应的过程.

Linux下跟踪:

2、域名解析的方式:

A记录:A代表的是Address,它用来指定域名对应的IP地址,A记录可以将多个域名解析为一个IP地址,但是不可以将一个域名解析到多个IP地址。
CNAME记录:即:别名记录。这种记录允许您将多个名字映射到同一台计算机。 通常用于同时提供WWW和MAIL服务的计算机。例如,有一台计算机名为“host.mydomain.com”(A记录)。 它同时提供WWW和MAIL服务,为了便于用户访问服务。可以为该计算机设置两个别名(CNAME):WWW和MAIL。

NS记录:NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。
TXT记录:TXT 记录,一般指为某个主机名或域名设置的说明。

3、清除缓存的域名:

要清除首先我们要学会查看一下我们的浏览器与操作系统的缓存:

windows下dos命令行输入:ipconfig /display

浏览器下(谷歌):在地址栏中输入:chrome://chrome-urls/可以查看所有的配置.

点击dns进入既可以查看。

上面的是我在学校的机房试的,学校的浏览器的版本太低了,我在我自己的电脑上是在地址栏中输入:chrome://net-internals/#dns
就可以,并且如果清除的话,会有一个按钮直接清除。

windows下清除dns缓存:(在windows下输入:ipconfig/flush)

六、CDN工作机制。

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值