网络传输协议介绍

一.网络传输中为什么需要协议

            在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑

     在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的

     口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太

     大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法

     的用电线把电脑连接到了一起。

            但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不

     能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP/IP就是为此而生。

     TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP

     协议,以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外

     语一样,就可以和其他的计算机终端做自由的交流了。

     摘自:https://www.cnblogs.com/fengzanfeng/articles/1339347.html

                          

     下图为上图的补充:

              扩展知识点之面向连接的协议和面向非连接的协议:

              面向连接的协议是指通信双方在通信时,要事先建立一条通信线路,其有三个过

              程:建立连接、使用连接和释放连接,如TCP协议;面向非连接是指在正式通信

              前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信

              非常相似:你在发短信的时候,只需要输入对方手机号就OK了,比如UDP协议,

              QQ就是使用UDP协议。

二.HTTP协议

    关于http比较全面的一篇文章:

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP

    没有看完,太枯燥

    1.HTTP协议由两部分程序实现:一个客户机程序和一个服务器程序,它们运行在不同

       的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的格式,以及客

       户机和服务器是如何进行报文交换的,即:Web客户机是如何向Web服务器请求Web

       页面,以及服务器如何将Web页面传送给客户机。

    2.Http协议是建立在TCP协议基础之上的。

       当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP

       建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP

       连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。

       所谓的无状态,就是没有记忆能力,是指浏览器每次向服务器发起请求的时候,不是

       通过一个连接,而是每次都建立一个新的连接,即每次请求都是一个全新的连接。

       如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息

       状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,

       成为无状态连接。假如某个特定的客户机在短短的几秒钟内两次请求同一个对象,服

       务器并不会因为刚刚为该用户提供了该对象就不再做出反应,而是重新发送该对象,

       就像该服务器已经完全忘记不久之前所做过的事一样。所以在Java Web编程中引入了

       Session,用来保持特定客户端状态。

       HTTP同时又是无连接的,也叫短连接。无连接的含义是限制每次连接只处理一个请

       求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可

       以节省传输时间。早期这么做的原因是 HTTP 协议产生于互联网,因此服务器需要处

       理同时面向全世界数十万、上百万客户端的网页访问,但每个客户端(即浏览器)与

       服务器之间交换数据的间歇性较大(即传输具有突发性、瞬时性),并且网页浏览的

       联想性、发散性导致两次传送的数据关联性很低,大部分通道实际上会很空闲、无端

       占用资源。因此 HTTP 的设计者。随着时间的推移,网页变得越来越复杂,里面可能

       嵌入了很多图片,这时候每次访问图片都需要建立一次 TCP 连接就显得很低效。后来,

       HTTP的持久连接被提出用来解决这效率低的问题,关于持久连接请看本节4。

    3.HTTP连接同样需要经历三次握手和四次分手

       因为HTTP协议是建立在TCP协议之上的,所以同时需要考虑三次握手和四次分手。

    4.HTTP可以是持久连接也可以是非持久连接,HTTP 1.1起默认是持久连接。

       如果每个请求/响应对,都是经一个 单独的TCP连接 发送,该应用程序被称为使用

       非持久连接;如果所有的请求及相应的响应都经 相同的TCP连接 发送,则该应用

       程序被称为使用持久连接。

       HTTP 1.0中,通过Connection: Keep-alive标识是持久连接。

       HTTP 1.1中,默认就开启持久连接,除非HTTP首部有Connection: Close

       客户端根据这些标识去识别服务器是否支持持久连接。

       为什么要使用持久连接:

              随着时间的推移,html页面变得复杂了,里面可能嵌入了很多图片,这时候每

       次访问图片都需要建立一次tcp连接就显得低效了。因此持久连接被提出用来解决效

       率低的问题。从HTTP/1.1起,默认都开启了持久连接,保持连接特性,简单地说,

       当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关

       闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

       持久连接不会永久保持连接,它有一个保持时间,可以在不同的服务器软件

     (如Apache)中设定这个时间。虽然这里使用TCP连接保持了一段时间,但是这个时

       间是有限范围的,到了时间点依然是会关闭的,所以我们还把其看做是每次连接完成

       后就会关闭。后来,通过Session, Cookie等相关技术,也能保持一些用户的状态。

       但是还是每次都使用一个新的连接,依然是无状态连接。

       服务器处理非持久连接和持久连接的步骤,请看:

       https://blog.csdn.net/liqing19850102/article/details/12041491

    5.HTTP报文

       HTTP报文:它是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的

                           元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据

                           部分。这些报文都是在客户端、服务器和代理之间流动。

       HTTP报文的流动方向:一次HTTP请求,HTTP报文会从“客户端”流到“代理”再流到

                                             “服务器”,在服务器工作完成之后,报文又会从“服务器”流

                                             到“代理”再流到“客户端”。

       报文的语法:所有的HTTP报文都可以分为两类,请求报文和响应报文。请求和响

                            应报文的基本报文结构大致是相同的,只有起始行的语法有所不同。

       请求报文:它会向Web服务器请求一个动作

              请求报文的格式:

                      请求行: <method> <request-URL> <version>

                      请求头:   <headers>

                      主体:   <entity-body>

       响应报文:它会将请求的结果返回给客户端。

              响应报文的格式:

                      起始行:  <version> <status> <reason-phrase>

                      头部:    <headers>

                      主体:    <entity-body>

       HTTP报文的参数说明:

              * 方式(method):客户端希望服务器对资源执行的动作,是一个单独的词,比

                                          如,GET、POST或HEAD

              * 请求URL(request-URL):要直接与服务器进行对话,只要请求URL是资源的

                                                         绝对路径就可以了,服务器可以假定自己是URL的

                                                         主机/端口。

 

              * 版本(version):报文所使用的HTTP版本。其格式:

                                         HTTP/<主要版本号>.<次要版本号>

              * 状态码(status-code):状态码是三位数字,描述了请求过程中所发生的情况。

                                                    每个状态码的第一位数字都用于描述状态的一般类别

                                                    (比如,“成功”、“出错”等等)。

              * 原因短语(reason-phrase):数字状态码的可读版本,包含行终止序列之前的

                                                            所有文本。原因短语只对人类有意义,因此,尽

                                                            管响应行HTTP/1.0 200 NOT OK和

                                                            HTTP/1.0 200 OK中原因短语的含义不同,但同

                                                            样都会被当作成功指示处理。

              * 头部(header):可以有零个或多个头部,每个首部都包含一个名字,后面跟

                                         着一个冒号(:),然后是一个可选的空格,接着是一个值,最

                                         后是一个CRLF首部是由一个空行(CRLF)结束的,表示了头

                                         部列表的结束和实体主体部分的开始。

              关于HTTP协议的报文还有很多内容,这里就不一一列举了,请看:

              https://www.cnblogs.com/zhuifeng/p/4072248.html

    6.  http方法和含义

         GET:查询

         POST:创建

         PUT:修改

         DELETE:删除

    7.  HTTP常见状态码和含义

         2XX:表示成功

         3XX:表示重定向,需要进一步的操作以完成请求

         4XX:客户端错误,请求包含语法错误或无法完成请求

         5XX:服务器错误,服务器在处理请求的过程中发生了错误

 

 

         400       Bad Request        客户端请求的语法错误,服务器无法理解

                出现场景:

                       前端提交数据的字段名称或者是字段类型和后台的实体类不一致,导致无法封装

         401      未经授权的错误

                     未经授权的错误意味着访问系统需要身份验证的,而在请求中没有给予正当的认证

                     凭据(密码,token等)。这意味着服务器需要身份验证密码才能访问所请求的文

                     件或者资源。这也意味着服务器无法将您识别为具有正确身份验证的用户。

         403       Forbidden            服务器理解请求客户端的请求,但是拒绝执行此请求

                出现场景

                https://zhidao.baidu.com/question/189449429.html

                                                  网站设计人员可设置"您所请求的资源无法找到"的个性页面

         404 文件找不到

         405       Method Not Allowed      客户端请求中的方法被禁止

                出现场景

                        前端发送请求的方法和后端接收请求的方法对应不上,例如后端需要的是GET方

                        法,而前端使用了POST方法,会出现该错误。

 

三.Tcp协议

     1.TCP的三次握手和四次分手

      (1)一些概念补充

               Tcp(传输控制协议)层的一些flag字段,SYN、FIN、ACK、PSH、RST、URG。

               它们的含义是:

                      SYN表示建立连接,当SYN=1同时ACK=0的时,表明这是一个连接请求的

                                                       报文段;SYN=1,ACK=1时,时一个响应的报文段。

                      FIN表示关闭连接。

                      ACK表示响应,ACK是确定收到的字段,用来解决丢包的问题当ACK=1的

                                               时候“确认字号”(期望收到对方下一个报文段的第一个数据

                                               字节的编号)才有效。

                      PSH表示有 DATA数据传输。

                      RST表示连接重置。

                其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,

                它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是

                建立连接。TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是

                不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。RST

                一般是在FIN之后才会出现为1的情况,表示的是连接重置。一般地,当出现FIN

                包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和

                SYN+ACK包时,我们认为客户端与服务器建立了一个连接。PSH为1的情况,

                一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP

                数据包内容被传递。TCP的连接建立和连接关闭,都是通过请求-响应的模式完

                成的。

      (2)三次握手   

               为了理解三次握手,首先先了解为什么要三次握手:

                       信道是不可靠的,但是我们要建立可靠的连接发送可靠的数据,也就是数据

                       传输是需要可靠的。在这个时候三次握手是一个理论上的最小值,并不是说

                       是tcp协议要求的,而是为了满足在不可靠的信道上传输可靠的数据所要求

                       的。

                       如果不使用三次握手会怎么样呢?(这个解释不对)

                              第一次:首先A发送一个(SYN)到B,意思是A要和B建立连接进行通信。

                                             如果是只有一次握手的话,这样肯定是不行的,A压根都不知

                                             道B是不是收到了这个请求。    

                              第二次:B收到A要建立连接的请求之后,发送一个确认(SYN+ACK)给

                                             A,意思是收到A的消息了,B这里也是通的,表示可以建立连

                                             接。

                                             如果只有两次通信的话,这时候B不确定A是否收到了确认消

                                             息,有可能这个确认消息由于某些原因丢了,这会导致B误认

                                             为可以建立连接了,白白等待A端往过发消息。

                              第三次:A如果收到了B的确认消息之后,再发出一个确认(ACK)消息,

                                            意思是告诉B,这边是通的,然后A和B就可以建立连接相互通

                                            信了。

               超时重试机制:

                       如果第一个包,A发送给B请求建立连接的报文(SYN)如果丢掉了,A会周期

                       性的超时重传,直到B发出确认(SYN+ACK);

                       如果第二个包,B发送给A的确认报文(SYN+ACK)如果丢掉了,B会周期性的

                       超时重传,直到A发出确认(ACK);

                       如果第三个包,A发送给B的确认报文(ACK)如果丢掉了,

               三次握手的具体步骤:

                      第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据

                                            包到服务器,主机B由SYN=1知道,A要求建立联机。主机A进入

                                            SYN_SEND状态等待服务器确认。

                      第二次握手:主机B收到请求后要确认联机信息,向A发送

                                            ack number=(主机A的seq+1),syn=1,ack=1,随机产生

                                            seq=7654321的包。主机B进入SYN_RECV状态。

                      第三次握手:主机A收到后检查ack number是否正确,即第一次发送的

                                            seq number+1,以及位码ack是否为1,若正确,主机A会再发送

                                            ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值

                                            与ack=1则连接建立成功。完成三次握手,主机A与主机B开始传

                                            送数据。主机A和主机B进入ESTABLISHED状态。

      (3)四次分手

               首先了解一下TCP为什么要四次分手:

                       TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是

                       全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没

                       有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这

                       个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表

                       示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;

                       当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,

                       就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连

                       接。
               四次分手过程:

                      第一次分手:主机1,向主机2发送一个FIN报文段;此时,主机1进入

                                           FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了。

                      第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,

                                            主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关

                                            闭请求;

                      第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入

                                            LAST_ACK状态;

                      第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然

                                            后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,

                                            就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明

                                            Server端已正常关闭,那好,主机1也可以关闭连接了。

     2.HTTP和TCP

        HTTP是一种短连接,每次请求建立连接,请求结束后断开连接;TCP是一种长连接。

     3. HTTP请求的Method

       (1)GET(查) 

                       GET 方法的首要目的是获取资源。当然您也可以走野路子,不过在这里

                seaconch并不提倡。

                方法特点:

                       --  参数可见

                       --  数据类型只允许 ASCII

                           关于为什么GET可以传中文(中文不是ASCII的)

                           如果你的 Get 请求中有非 ASCII 字符,会在请求之前进行转码,得到没有非

                           ASCII 字符的 URL,比如使用URLencode(),然后去发起 Get 请求,这样请

                           求的路径里不是没有非ASCII。 

                       --  可以被缓存

                           GET 方法支持缓存,当本次请求允许被缓存时,会将资源存值本地 cache ,

                           在未过期的情况下直接取本地 cache;缓存过期后视情况而定。

                       --  可以保存书签

                           当我们访问某一个网站的频率特别高的时候,肯定添加到书签,那其实书签

                           就是依靠 GET 方法来保存的

                       --  请求长度会受限于所使用的浏览器与服务器

                           不同的浏览器对于 GET 请求长度的限制也是不同的,注意这是 浏览器 / 服务

                           器(IE、Chrome、Apache、IIS等) 对于长度的限制,而不是 HTTP 协议

       (2)POST(增)

                方法特点

                       POST 方法的首要目的是 提交,POST 方法一般用于添加资源。

                       --  数据类型,不限,不像GET必须是ASCII。

                       --  POST 请求与 GET 请求不同,他会首先提交 HEAD 信息,待得到 100 响应

                           后,才会再次将 DATA 提交

                       --  不限制请求长度

                           对于 POST 方法这种以 提交 为首要目的的方法,肯定是不可以限制请求长度

                           的。

                       --  参数不可见

                       --  不能收藏为书签

                       --  不可以被缓存

          GET方法是POST方法的区别:

              --  get参数通过url传递,post放在request body中。

              --  get请求在url中传递的参数是有长度限制的,而post没有。

              --  GET产生一个TCP数据包;POST产生两个TCP数据包。

       (3)HEAD(查)

                HEAD方法用于获取报头信息,HEAD 方法与 GET 方法类似,但并不会返回响应主

                体例如检查 cache 是否被修改,是否过期,HEAD方法与 GET 方法类似,但并不会

                返回响应主体使用场合没有GET多。比如下载前使用HEAD发送请求,通过

      ContentLength响应字段,来了解网络资源的大小;或者通过LastModified响应字段

                来判断本地缓存资源是否要更新。 

       (4)OPTIONS 

                OPTIONS 方法的首要目的是 Priflight Request(预检请求)

                https://cloud.tencent.com/developer/news/397683

 

       (5)PUT 与 PATCH(改)

                PUT 对后台来说 PUT 方法的参数是一个完整的资源对象,它包含了对象的所有字段

                PATCH 对后台来说 PATCH 方法的参数只包含我们需要修改的资源对象的字段

       (6)DELETE(删)

                方法一般用于删除资源

                用于删除资源

         注:其实虽然我们都说 POST(增) DELETE(删)PUT(改)GET(查),但其实真正

                我们是如何实现方法的是随意的,也就是你完全可以用 GET 删除资源,DELETE 增

                加资源,所以说还有些没想明白的同学到这里就可以释然了,毕竟规定是死的,人是

                活的,但是按照规定是好的,不按规定也是可以的。

四.socket

     1.socket介绍

        socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,

        socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户

        来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。Socket是处

        于传输层的,主要有UDP和TCP两个协议。

     2.socket和HTTP相比较

      (a)Socket传输的特点:

               优点:

               * 传输数据为字节级,传输数据可自定义,数据量小(对于手机应用讲:费用低)

               * 传输数据时间短,性能高

               * 适合于客户端和服务器端之间信息实时交互

               * 可以加密,数据安全性强

               缺点:

               * 需对传输的数据进行解析,转化成应用级的数据

               * 对开发人员的开发水平要求高

               * 相对于Http协议传输,增加了开发量

      (b)HTTP传输的特点

               优点:

               * 基于应用级的接口使用方便

               * 程序员开发水平要求不高,容错性强

               缺点:

              * 传输速度慢,数据包大(Http协议中包含辅助应用信息)

              * 如实时交互,服务器性能压力大。

              * 数据传输安全性差

      (c)各数据传输方式的适用范围

               Socket传输适用范围:

               Socket 传输方式适合于对传输速度,安全性,实时交互,费用等要求高的应用中,

               如网络游戏,手机应用,银行内部交互等

               基于Http协议传输的适用范围:

               基于http协议传输的特点:基于http协议传输方式适合于对传输速度,安全性要求不

               是很高,且需要快速开发的应用。如公司OA系统,互联网服务等。

      (d)socke和http的区别

               HTTP为短连接、socket为长连接,socket可以实现很多协议,但是经常使用的是TCP

               协议。

               很多情况下,都是需要服务器端向客户端主动推送数据,保持客户端与服务端的实时

               同步。若双方是 Socket 连接,可以由服务器直接向客户端发送数据;若双方是HTTP

               连接,则服务器需要等客户端发送请求后,才能将数据回传给客户端。

五.FTP

     文件传输协议,用于上传或下载文件。FTP使用两个并行的TCP连接来传输文件,一个是控

     制连接(control connection),一个是数据连接(data connection)。 控制连接用于在两个

     主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及“put”和“get”文件的命

     令;数据连接用于实际传输一个文件,FTP的控制连接是持久连接,数据连接是非持久连接。

     * FTP服务器必须在整个会话期间保留用户的状态(state)信息。

       FTP服务器必须把特定的用户账户与控制连接联系起来,随着用户在远程目录树上移动,

       服务器必须追踪用户在远程目录树上的当前位置。对每个活动着的用户会话的状态进行追

       踪,可以对FTP会话总数进行限制

posted @ 2019-04-22 12:27  jialanshun  阅读(1301)  评论(0编辑  收藏  举报