首先咱们知道HTTP协议一般承载于TCP协议之上,HTTPS承载于TLS或SSL协议层之上html
经过上面这张图咱们可以知道。
在Http工做以前,Web浏览器经过网络和Web服务器创建链链接,该链接是经过Tcp来完成的,该协议和Ip共同组成了Internet,即著名的Tcp/Ip协议族,Http是比Tcp更高的应用层协议,通常Tcp接口的端口好是80。
TCP 被称为“面向链接”的传输层协议。关于它的具体细节,就不展开了。你只需知道:传输层主要有两个协议,分别是 TCP 和 UDP。TCP 比 UDP 更可靠。你能够把 TCP 协议想象成某个水管,发送端这头进水,接收端那头就出水。而且 TCP 协议可以确保,先发送的数据先到达(与之相反,UDP 不保证这点)前端
TCP(Transmission Control Protocol) 传输控制协议
TCP是主机对主机层的传输控制协议,提供可靠的链接服务,采用三次握手确认创建一个链接:
位码即tcp标志位,有6种标示:SYN(创建联机) ACK(确认) PSH(传送) FIN(结束) RST(重置) URG(紧急) Sequence number(顺序号码) Acknowledge number(确认号码)web
第一次握手:客户端发送了一个带有SYN(创建链接)的Tcp报文到服务器,这个三次握手中的开始。表示客户端想要和服务端创建链接。 浏览器
第二次握手:服务端接收到客户端的请求,返回客户端报文,这个报文带有SYN(创建链接)和ACK(确认)标志,询问客户端是否准备好。 缓存
第三次握手:.客户端再次响应服务端一个ACK(确认),表示我已经准备好。
思考:为何要三次握手呢,有人说两次握手就行了?
举一个例子:已失效的链接请求报文段,
client发送了第一个链接的请求报文,可是因为网络很差,这个请求没有当即到达服务端,而是在某个网络节点中滞留了,直到某个时间才到达server,原本这已是一个失效的报文,可是server端接收到这个请求报文后,仍是会想client发出确认的报文,表示赞成链接。假如不采用三次握手,那么只要server发出确认,新的创建就链接了,但其实这个请求是失效的请求,client是不会理睬server的确认信息,也不会向服务端发送确认的请求,可是server认为新的链接已经创建起来了,并一直等待client发来数据,这样,server的不少资源就没白白浪费掉了,采用三次握手就是为了防止这种状况的发生,server会由于收不到确认的报文,就知道client并无创建链接。这就是三次握手的做用。安全
第一次挥手:TCP发送一个FIN(结束),用来关闭客户到服务端的链接。服务器
第二次挥手:服务端收到这个FIN,他发回一个ACK(确认),确认收到序号为收到序号+1,和SYN同样,一个FIN将占用一个序号。网络
第三次挥手:服务端发送一个FIN(结束)到客户端,服务端关闭客户端的链接。tcp
第四次挥手:客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。ide
思考:那么为何是4次挥手呢?
可能有人会有疑问,tcp我握手的时候为什么ACK(确认)和SYN(创建链接)是一块儿发送。挥手的时候为何是分开的时候发送呢.
由于当Server端收到Client端的SYN链接请求报文后,能够直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。可是关闭链接时,当Server端收到FIN报文时,极可能并不会当即关闭SOCKET,因此只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端全部的报文都发送完了,我才能发送FIN报文,所以不能一块儿发送。故须要四步握手。
我这里简单列举几个,由于我尚未研究UDP这个协议。
1.基于链接与无链接;(UDP是非链接)
2.对系统资源的要求(TCP较多,UDP少
3.UDP程序结构较简单
4.流模式与数据报模式 ;(TCP是流模式)
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
三次握手之状态
四次握手之状态
TIME_WAIT存在的意义
1.HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通讯的规则,经过因特网传送万维网文档的数据传送协议。
2.HTTP协议做为TCP/IP模型中应用层的协议也不例外。HTTP协议一般承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了咱们常说的HTTPS。以下图:
3.HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
4.HTTP默认的端口号为80,HTTPS的端口号为443。
5.浏览网页是HTTP的主要应用,可是这并不表明HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通讯的双方都遵照这个协议,HTTP就能有用武之地。好比我们经常使用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其余的协议)。
一、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。因为HTTP协议简单,使得HTTP服务器的程序规模小,于是通讯速度很快。
二、灵活:HTTP容许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
三、HTTP 0.9和1.0使用非持续链接:限制每次链接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开链接。HTTP 1.1使用持续链接:没必要为每一个web对象建立一个新的链接,一个链接能够传送多个对象,采用这种方式能够节省传输时间。
四、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。另外一方面,在服务器不须要先前信息时它的应答就较快。
五、支持B/S及C/S模式。
一次HTTP操做称为一个事务,其工做过程可分为四步:
1.首先客户机与服务器须要创建链接。只要单击某个超级连接,HTTP的工做开始。
2.创建链接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4.客户端接收服务器所返回的信息经过浏览器显示在用户的显示屏上,而后客户机与服务器断开链接。
若是在以上过程当中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来讲,这些过程是由HTTP本身完成的,用户只要用鼠标点击,等待信息显示就能够了。
客户端发送一个HTTP请求到服务器的请求消息包括如下格式:
请求行、请求头部、空行和请求数据四个部分组成。
Get请求例子
GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。
从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,而且在每一个请求中自动发送等等
即便第四部分的请求数据为空,也必须有空行。
这个例子的请求数据为空。
POST请求例子
第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。
通常状况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
第一行为状态行,(HTTP/1.1)代表HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二行和第三行和第四行为消息报头,
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1
空行后面的html部分为响应正文。
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操做
4xx:客户端错误--请求有语法错误或请求没法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
根据HTTP标准,HTTP请求可使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行做为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
如下是 HTTP 请求/响应的步骤:
一、客户端链接到Web服务器
一个HTTP客户端,一般是浏览器,与Web服务器的HTTP端口(默认为80)创建一个TCP套接字链接。例如,http://www.oakcms.cn。
二、发送HTTP请求
经过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
三、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
四、释放链接TCP链接
若connection 模式为close,则服务器主动关闭TCP链接,客户端被动关闭链接,释放TCP链接;若connection 模式为keepalive,则该链接会保持一段时间,在该时间内能够继续接收请求;
五、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看代表请求是否成功的状态代码。而后解析每个响应头,响应头告知如下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
一、GET提交的数据会放在URL以后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
二、GET提交的数据大小有限制(由于浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
三、GET方式须要使用Request.QueryString来取得变量的值,而POST方式经过Request.Form来获取变量的值。
四、GET方式提交数据,会带来安全问题,好比一个登陆页面,经过GET方式提交数据时,用户名和密码将出如今URL上,若是页面能够被缓存或者其余人能够访问这台机器,就能够从历史记录得到该用户的帐号和密码.
1.HTTP是明文传输的,也就意味着,介于发送端、接收端中间的任意节点均可以知道大家传输的内容是什么。这些节点多是路由器、代理等。
举个最多见的例子,用户登录。用户输入帐号,密码,采用HTTP的话,只要在代理服务器上作点手脚就能够拿到你的密码了。
用户登录 --> 代理服务器(作手脚)--> 实际受权服务器
2.在发送端对密码进行加密?没用的,虽然别人不知道你原始密码是多少,但可以拿到加密后的帐号密码,照样能登录。(这也是不少人以为前端加密并无啥软用)
稍微了解网络基础的同窗都知道,HTTP是应用层协议,位于HTTP协议之下是传输协议TCP。TCP负责传输,HTTP则定义了数据如何进行包装。
从上面图中咱们能够看出:HTTPS相对于HTTP有哪些不一样呢?其实就是在HTTP跟TCP中间加多了一层加密层TLS/SSL。
神马是TLS/SSL?
通俗的讲,TLS、SSL实际上是相似的东西,SSL中文叫作“安全套接层”,SSL是个加密套件,负责对HTTP的数据进行加密。TLS是SSL的升级版。如今提到HTTPS,加密套件基本指的是TLS。
传输加密的流程
原先是应用层将数据直接给到TCP进行传输,如今改为应用层将数据给到TLS/SSL,将数据加密后,再给到TCP进行传输。
就是这么回事。将数据加密后再传输,而不是任由数据在复杂而又充满危险的网络上明文裸奔,在很大程度上确保了数据的安全。这样的话,即便数据被中间节点截获,坏人也看不懂。
通常来讲,加密分为对称加密、非对称加密(也叫公开密钥加密)。
对称加密的意思就是,加密数据用的密钥,跟解密数据用的密钥是同样的。
对称内容加密强度很是高,通常破解不了。但存在一个很大的问题就是没法安全地生成和保管密钥。假如客户端软件和服务器之间每次会话都使用固定的,相同的密钥加密和解密,确定存在很大的安全隐患。若是
有人从客户端端获取到了对称密钥,整个内容就不存在安全性了,并且管理海量的客户端密钥也是一件很复杂的事情。
非对称加密的意思就是,加密数据用的密钥(公钥),跟解密数据用的密钥(私钥)是不同的。
什么叫作公钥呢?其实就是字面上的意思——公开的密钥,谁均可以查到。所以非对称加密也叫作公开密钥加密。
相对应的,私钥就是非公开的密钥,通常是由网站的管理员持有。
公钥、私钥两个有什么联系呢?
简单的说就是,经过公钥加密的数据,只能经过私钥解开。经过私钥加密的数据,只能经过公钥解开。
不少同窗都知道用私钥能解开公钥加密的数据,但忽略了一点,私钥加密的数据,一样能够用公钥解密出来。而这点对于理解HTTPS的整套加密、受权体系很是关键。
非对称密钥交换很安全,但同时也是 HTTPS 性能和速度下降的“罪魁祸首”。