上一篇的传送门:TCP/IP常见问题总结(一)

6. TCP滑动窗体与回退N帧协议

TCP作为一个提供可靠服务的传输层协议,对于数据的发送必须拥有一套良好的反馈机制。让发送方得知接收方接收到了数据。而TCP下的反馈机制大部分借鉴与数据链路层的反馈机制。因此在此我们分析一下数据链路层的反馈机制。

1.停等协议

停等协议是一种很easy的协议,发送方在发送完一帧数据后就一直等待接收方的确认信号(ACK)。要是超时就重传数据。仅仅到收到ACK信号后才发送下一帧数据。停等协议效率较低(如此低效数据链路层都不适用,TCP协议当然也不用了),其示意图例如以下:


2.滑动窗体协议之GoBackN

因为发完一帧数据后发送方就挂起等待的行为很低效。因此滑动窗体协议诞生了。

滑动窗体的意思事实上就是一个缓冲区(发送方为发送窗体,接收方为接收窗体),缓冲区的内容会随着数据的发送而移动,因此称为滑动窗体。

我们先来讲讲滑动窗体协议中的GoBackN协议。

滑动窗体协议同意发送方连发数帧,每发一帧都相应 一个计时器timeout,而GoBackN协议要求发送方把丢失帧及其之后的帧所有重传(由于光凭一个ACK并不能确定哪些帧出现了丢失,ACK的含义是:期待接收序号为N的帧,之前所有的帧都已经成功收到并依此交给了上层)。其示意图例如以下:


上图因为Data2丢失,导致了Data2~Data5的重发(窗体大小为4)

3.滑动窗体协议之选择性重发

因为GoBackN中重发已经发送过的数据有点多余,因此选择性重发协议诞生了。选择性重发协议在ACK上引入了NAK的概念(否定性确认帧)。表示小于N的帧已经所有收到并交给了上层。而第N帧丢失了,要求重发第N帧。当发送方接到NAK后,仅仅要重发NAK表示的那一帧就可以。其示意图例如以下:

上图中发送方发送的Data2丢失了,因此收到了接收方的NAK2,然后发送方仅仅需又一次发送Data2就可以。
在TCP协议中使用的也是选择性重发协议。

7. Http的报文结构

Http协议(Hypertext Transfer Protocol)即超文本传输协议,它是一个应用层的基于TCP的无状态的协议,一般的通信过程为:建立连接、发送请求、响应请求、释放连接。其报文结构分为请求头与响应头两种:

请求头


请求头的第一行为请求行,其包含了三部分重要内容:
  1. 请求方法:主要为Get、Post等方法
  2. URL:即请求的地址
  3. 协议版本号:主要有Http1.0和Http1.1两种
请求头接下来是请求头部(也叫头域),头域的长度是不固定的,每个头域属性的格式为:字段名:值(如:Range:请求范围)
头域以下是一行空行。表示头域的结束。
空行下来就是请求要提交的数据。

响应头


与请求头类似,响应头的第一行为响应行,主要包括例如以下三部分内容:
  1. 版本号:使用的Http协议版本号
  2. 状态码:表示处理结果状态的数值,由三位数字组成,第一位数字表示响应的类型,主要有下面几种:
    • 1XX:表示server已接收了client请求,client可继续发送请求
    • 2XX:表示server已成功接收到请求并进行处理
    • 3XX:表示server要求client重定向
    • 4XX:表示client的请求有非法内容
    • 5XX:表示server未能正常处理client的请求而出现意外错误
  3. 原因短语:一串用于解释返回该状态码原因的字符串
响应行下来是响应头域,与请求头类似。

响应头域下来是一行空行表示响应头域的结束。
最后是响应头的响应实体内容。

8. Http的状态码含义

状态码位于响应头的响应行中。表示server处理结果的情况,由三位数字组成。第一位数字表示响应的类型。主要有下面几种:

1XX:表示server已接收了client请求。client可继续发送请求



100 (Continue/继续)

假设server收到头信息中带有100-continue的请求。这是指client询问能否够在兴许的请求中发送附件。在这样的情况下,server用100允许client继续或用417 (Expectation Failed)告诉client不允许接受附件。

这个状态码是 HTTP 1.1中新增加的。 





101 (Switching Protocols/转换协议)

101 状态码是指server将依照其上的头信息变为一个不同的协议。这是 HTTP 1.1中新增加的。


2XX:表示server已成功接收到请求并进行处理



200 (OK/正常)

200 的意思是一切正常。一般用于对应GET和POST请求。 





201 (Created/已创建)

201表示server在请求的响应中建立了新文档;应在定位头信息中给出它的URL。





202 (Accepted/接受)

202告诉client请求正在被运行,但还没有处理完。 





203 (Non-Authoritative Information/非官方信息)

状态码203是表示文档被正常的返回,可是因为正在使用的是文档副本所以某些响应头信息可能不对。这是 HTTP 1.1中新增加的。 





204 (No Content/无内容)

在并没有新文档的情况下,204确保浏览器继续显示先前的文档。这各状态码对于用户周期性的重载某一页很实用。而且你可以确定先前的页面是否已经更新。

可是,这样的方法对通过刷新响应头信息或等价的HTML标记自己主动重载的页面起作用,由于它会返回一个204状态码停止以后的重载。但基于JavaScript脚本的自己主动重载在这样的情况下仍然须要可以起作用。



205 (Reset Content/重置内容)

重置内容205的意思是尽管没有新文档但浏览器要重置文档显示。

这个状态码用于强迫浏览器清除表单域。这是 HTTP 1.1中新增加的。 





206 (Partial Content/局部内容)

206是在server完毕了一个包括Range头信息的局部请求时被发送的。

这是 HTTP 1.1中新增加的。 


3XX:表示server要求client重定向



300 (Multiple Choices/多重选择)

300表示被请求的文档能够在多个地方找到,并将在返回的文档中列出来。

假设server有首选设置,首选项将会被列于定位响应头信息中。 





301 (Moved Permanently)

301状态是指所请求的文档在别的地方。文档新的URL会在定位响应头信息中给出。

浏览器会自己主动连接到新的URL。 





302 (Found/找到)

与301有些类似,仅仅是定位头信息中所给的URL应被理解为暂时交换地址而不是永久的。

注意:在 HTTP 1.0中。消息是暂时移动(Moved Temporarily)的而不是被找到。 





303 (See Other/參见其它信息)

这个状态码和 301、302 相似,仅仅是假设最初的请求是 POST。那么新文档(在定位头信息中给出)药用 GET 找回。这个状态码是新增加 HTTP 1.1中的。 





304 (Not Modified/为修正)

当client有一个缓存的文档,通过提供一个 If-Modified-Since 头信息可指出client仅仅希望文档在指定日期之后有所改动时才会重载此文档,用这样的方式能够进行有条件的请求。304是指缓冲的版本号已经被更新而且client应刷新文档。另外。server将返回请求的文档及状态码 200。





305 (Use Proxy/使用代理)

305表示所请求的文档要通过定位头信息中的代理server获得。

这个状态码是新增加 HTTP 1.1中的。 





307 (Temporary Redirect/暂时重定向)

浏览器处理307状态的规则与302同样。

307状态被增加到 HTTP 1.1中是因为很多浏览器在收到302响应时即使是原始消息为POST的情况下仍然运行了错误的转向。仅仅有在收到303响应时才假定浏览器会在POST请求时重定向。增加这个新的状态码的目的非常明白:在响应为303时依照GET和POST请求转向;而在307响应时则依照GET请求转向而不是POST请求。该状态码是新增加HTTP 1.1中的。

4XX:表示client的请求有非法内容



400 (Bad Request/错误请求)

400指出client请求中的语法错误。

401 (Unauthorized/未授权)

401表示client在授权头信息中没有有效的身份信息时訪问受到password保护的页面。

这个响应必须包括一个WWW-Authenticate的授权信息头。

403 (Forbidden/禁止)

403的意思是除非拥有授权否则server拒绝提供所请求的资源。这个状态常常会因为server上的损坏文件或文件夹许可而引起。 





404 (Not Found/未找到)

404状态每一个网络程序猿可能都遇到过,他告诉client所给的地址无法找到不论什么资源。它是表示“没有所訪问页面”的标准方式。

405 (Method Not Allowed/方法未同意)

405指出请求方法(GET, POST, HEAD, PUT, DELETE, 等)对某些特定的资源不同意使用。该状态码是新增加 HTTP 1.1中的。 





406 (Not Acceptable/无法訪问)

406表示请求资源的MIME类型与client中Accept头信息中指定的类型不一致。

406是新增加 HTTP 1.1中的。

407 (Proxy Authentication Required/代理server认证要求)

407与401状态有些相似。仅仅是这个状态用于代理server。该状态指出client必须通过代理server的认证。代理server返回一个Proxy-Authenticate响应头信息给client。这会引起client使用带有Proxy-Authorization请求的头信息又一次连接。该状态码是新增加 HTTP 1.1中的。 





408 (Request Timeout/请求超时)

408是指服务端等待client发送请求的时间过长。该状态码是新增加 HTTP 1.1中的。

409 (Conflict/冲突)

该状态通常与PUT请求一同使用,409状态常被用于试图上传版本号不对的文件时。该状态码是新增加 HTTP 1.1中的。 





410 (Gone/已经不存在)

410告诉client所请求的文档已经不存在而且没有更新的地址。

410状态不同于404。410是在指导文档已被移走的情况下使用。而404则用于未知原因的无法訪问。

该状态码是新增加 HTTP 1.1中的。 





411 (Length Required/须要数据长度)

411表示server不能处理请求(如果为带有附件的POST请求),除非client发送Content-Length头信息指出发送给server的数据的大小。该状态是新增加 HTTP 1.1的。 





412 (Precondition Failed/先决条件错误)

412状态指出请求头信息中的某些先决条件是错误的。该状态是新增加 HTTP 1.1的。 





413 (Request Entity Too Large/请求实体过大)

413告诉client如今所请求的文档比server如今想要处理的要大。假设server觉得可以过一段时间处理。则会包括一个Retry-After的响应头信息。该状态是新增加 HTTP 1.1的。 





414 (Request URI Too Long/请求URI过长)

414状态用于在URI过长的情况时。

这里所指的“URI”是指URL中主机、域名及port号之后的内容。该状态是新增加 HTTP 1.1的。 





415 (Unsupported Media Type/不支持的媒体格式)

415意味着请求所带的附件的格式类型server不知道怎样处理。

该状态是新增加 HTTP 1.1的。

416 (Requested Range Not Satisfiable/请求范围无法满足)

416表示client包括了一个server无法满足的Range头信息的请求。该状态是新增加 HTTP 1.1的。



417 (Expectation Failed/期望失败)

假设server得到一个带有100-continue值的Expect请求头信息,这是指client正在询问能否够在后面的请求中发送附件。在这样的情况下,server也会用该状态(417)告诉浏览器server不接收该附件或用100状态告诉client能够继续发送附件。

该状态是新增加 HTTP 1.1的。

5XX:表示server未能正常处理client的请求而出现意外错误

500 (Internal Server Error/内部server错误)

500是经常使用的“server错误”状态。





501 (Not Implemented/未实现)

501状态告诉clientserver不支持请求中要求的功能。比如。client运行了如PUT这种server并不支持的命令。 





502 (Bad Gateway/错误的网关)

502被用于充当代理或网关的server;该状态指出接收server接收到远端server的错误响应。 





503 (Service Unavailable/服务无法获得)

状态码503表示server因为在维护或已经超载而无法响应。





504 (Gateway Timeout/网关超时)

该状态也用于充当代理或网关的server。它指出接收server没有从远端server得到及时的响应。该状态是新增加 HTTP 1.1的。

505 (HTTP Version Not Supported/不支持的 HTTP 版本号)

505状态码是说server并不支持在请求中所标明 HTTP 版本号。

该状态是新增加 HTTP 1.1的。


9. Http request的几种方法

在Http中主要包括下面请求方法:
  • GET: 请求指定的页面信息。并返回实体主体
  • HEAD: 仅仅请求页面的首部。
  • POST: 请求server接受所指定的文档作为对所标识的URI的新的从属实体
  • PUT: 从client向server传送的数据代替指定的文档的内容
  • DELETE: 请求server删除指定的页面
  • OPTIONS: 同意client查看server的性能
  • TRACE: 请求server在响应中的实体主体部分返回所得到的内容
  • PATCH: 实体中包括一个表。表中说明与该URI所表示的原内容的差别
  • MOVE: 请求server将指定的页面移至还有一个网络地址
  • COPY: 请求server将指定的页面拷贝至还有一个网络地址
  • LINK: 请求server建立链接关系
  • UNLINK: 断开链接关系
  • WRAPPED: 同意client发送经过封装的请求
  • CONNECT:用于动态切换到隧道的代理
当中Http1.0仅支持GET、HEAD和POST,其余方法均为Http1.1加入。

值的注意的是:GET方法与POST方法类似,但GET方法參数写在URL上,POST參数写在请求实体内容中,且GET方法參数不大于1024Byte,POST则没有限制。

10. Http1.1和Http1.0的差别

Http1.0与Http1.1主要有下面差别:
  1. 是否同意复用连接:Http1.0不同意,响应请求后就断开连接。Http1.1同意且默认开启连接复用
  2. Host头域:Http1.0没有,Http1.1有
  3. 状态码:Http1.1比Http1.0多了100,101,203,205等状态码,详见问题8
  4. 请求方式:Http1.0仅仅有GET、HEAD和POST方法,Http1.1新增了其它多种方法。详见问题9

TCP/IP常见问题总结(二)的更多相关文章

  1. TCP/IP协议(二)tcp/ip基础知识

    今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...

  2. TCP/IP协议(二)

    2014-09-04 11:03:27   注:关于seq 和 ack 的理解,seq为发送的字节的第一个序号,一直累加,ack接收字节的最后一个序号+1,建立连接和结束连接时的SYN.FIN标志位占 ...

  3. TCP/IP协议学习(二) LWIP用户自定义配置文件解析

    LWIP协议支持用户配置,可以通过用户裁剪实现最优化配置,LWIP默认包含opts.h作为系统默认配置,不过通过添加lwipopts.h文件并包含在opts.h头文件之前就可以对lwip进行用户裁剪, ...

  4. TCP/IP协议族(二) HTTP报文头解析

    本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述.下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该字段名所对应的值,每 ...

  5. OSI模型和TCP/IP协议族(二)

    OSI模型中的各层 物理层 物理层(physical layer)协调通过物理媒体传送比特流时所需要的各种功能.物理层涉及到接口和传输媒体的机械和电器规约.它还定义了这些物理设备即接口为了实现传输必须 ...

  6. TCP/IP详解 笔记十四

    TCP/IP协议(二)  连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...

  7. RocEDU.阅读.写作《图解TCP/IP》

    2015年11月21日 一.对本书的认识 信息通信社会这个词俨然是现代社会的一个名词.人们可以使用各种信息终端随时随地的进行交流,而这种环境正是以来网络才得以实现,使用最为广泛的协议就是TCP/IP协 ...

  8. 计算机网络及TCP/IP知识点(全面,慢慢看)

    TCP/IP网络知识点总结 一.总述 1.定义:计算机网络是一些互相连接的.自治的计算机的集合.因特网是网络的网络. 2.分类: 根据作用范围分类: 广域网 WAN (Wide Area Networ ...

  9. TCP/IP网络知识点总结

    学完了计算机网络是时候整理一篇总结了,温故知新.注意:这篇博客很长长长(2.5万字+50图). TCP/IP网络知识点总结 一.总述 1.定义:计算机网络是一些互相连接的.自治的计算机的集合.因特网是 ...

随机推荐

  1. 03CSS内容背景

    CSS内容背景 设置背景颜色——background-color  插入背景图片——background-image  设置背景图片位置——background-position 设置重复背景图片—— ...

  2. xingo的demo部署

    1)安装go 2)安装git xingo默认使用google protobuf来进行序列化和反序列化操作,所以需要安装 go get  github.com/golang/protobuf/proto ...

  3. 服务器端编程心得(二)—— Reactor模式

    最近一直在看游双的<高性能linux服务器编程>一书,下载链接: http://download.csdn.net/detail/analogous_love/9673008 书上是这么介 ...

  4. 使用maven的mybatis-generator代码生成器插件生成实体类、mapper配置文件和mapper接口(使用idea)

    接着之前创建的ssmMaven项目 一: 在pom文件中加入mybatis-generator插件 <plugins> <plugin> <groupId>org. ...

  5. IO之Print流举例

    import java.io.*; public class TestPrintStream1 { public static void main(String[] args) { PrintStre ...

  6. WinMain名词解析

    WinMain程序名词解析 int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nS ...

  7. 集训第六周 数学概念与方法 数论 线性方程 I题

    Description The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Tr ...

  8. Not so Mobile (针对递归输入的函数)

      Before being an ubiquous communications gadget, a mobile was just a structure made of strings and ...

  9. 圆角计算 Shader

    圆角的计算 在Shader中,我们使用UV坐标来计算需要显示的部分和不需要显示的部分,使用透明来处理显示与不显示.UV坐标如下图1,我们将坐标平移到图2位置,面片的UV坐标原点在面片中心,UV坐标范围 ...

  10. Windows和Linux启动虚拟环境

    快速跳转到Linux操作 Windows启动虚拟环境 <!--tab回车可以补全--> 安装virtualenv pip install virtualenv 创建虚拟环境 方法一: py ...