博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP 和 HTTP 简介
阅读量:6538 次
发布时间:2019-06-24

本文共 3502 字,大约阅读时间需要 11 分钟。

hot3.png

##层次、协议和接口

为了降低网络设计的复杂性,绝大多数网络都组织成一个层次栈(stack of layer)或分级栈 (stack of level)的结构。不同机器上构成相应层次的实体称为对等体(peer),这些对等体可能是软件过程、硬件设备,甚至人类,如下图中主机1的第n层与主机2的第n层之间就是对等体。

对等体间就如何进行通信制定的规则和约定统称为协议,但对等体之间并不直接进行通信,每一层都把数据和控制信息直接传递给他的下一层,这样一直传递到最底层后,通过物理介质进行实际的通信。

位于上层与下层之间的是接口,接口定义了下层向上层提供哪些原语操作和服务,并把下层的具体实现方法隐藏起来。同样地,上层对等体之间的协议设计也不考虑下层如何实现,他们会假装彼此间在进行直接对话。

得益于此,本文才可以在忽略了大部分较低层次的协议和接口的基础上仅抽取出书中与应用层协议有关的部分,毕竟 UP 现在只关心这一部分。而即使针对 TCP 和 HTTP,本文也略去了其有关连接的建立和释放、拥塞控制等大部分实现细节,仅着笔于消息单元的构造与协议的基本原理,这种情况下我们可以认为消息的传输条件都是理想化的,就像没有摩擦力的滑轮一样。

另外一个有必要提及的概念是数据包(packet)和它的 (header)。虽然在应用层我们对数据的体积并不敏感,但实际上很容易想象,在较低层次比如网络层上,数据一定是被分割成很多小份来进行传输的。因此为了应对这种分割和不可靠的底层传输可能对数据造成的不良影响,网络层在传输包之前必须在每个包上加一小段控制信息,这就是头。在目标端对等体中,这些头用于还原出完整的数据以向上层提交。任何一层给数据加的头都会在目标端对等体中被处理掉,不会提交给它的上层。另外数据包这个名字仅是对网络层消息单元的叫法,在不同的层上他们有不同的封装,也就有不同的名字,比如报文(message)或(frame)等。

出于类似的目的(可能并不需要分割数据),应用层协议也使用头来给数据添加控制信息,比如 HTTP 头。因此头可以看做是协议的一部分实现。消息单元中除掉头的部分<span style="text-decoration:line-through;">都可以吃</span>叫做有效载荷(payload)。 <br /> ##TCP

传输层的最终目标是向它的用户提供高效的、可靠的和成本有效的数据传输服务,它的用户通常是应用层的进程。本文中使用术语(segment)来表示本层传输实体之间发送的消息,段的老名字叫传输协议数据单元(TPDU),现在已经不用了。

TCP 服务由发送端和接收端创建一种称为套接字(socket)的端点来获得,每个套接字有一个套接字编号(地址),该编号由主机的 IP 地址和一个本地主机的 16 位端口号组成。一个套接字可以被用于多个连接。所有的 TCP 连接都是全双工的,并且是点到点的,TCP 不支持组播或者广播传输模式。一个 TCP 连接就是一个字节流,而不是消息流。这意味着端到端之间不保留消息的边界。 <br /> ###TCP 段的头 如下图,每个段的起始部分是一个固定格式的 20 字节头。固定头之后是可能有的选项。数据部分最大为 65535-20-20 = 65495 字节。65535 是现在 IP数据报(IP Datagram)的最大长度,后面两个 20 分别来自 IP数据报与段的头。不过一般不会用到这么大,通常有效载荷不会超过 1460 字节。这个数字来自于以太网的有效载荷 1500 字节 -20-20 。没有有效载荷的 TCP 段也是合法的,一般用作确认和控制消息。

正如前面提到的层次间互相独立性,这里段头也仅指定了源主机与目标主机的 16 位端口号,他对两方的 IP 地址毫不关心。如果再加上两方的 IP 信息,这就组成了可以唯一标识一条连接的5 元组(5 tuple)。其中五个元素分别为:协议(TCP)、源端的 IP + 端口、目标端的 IP + 端口。

序号(Sequence number)和 确认号(Acknowledgement number)是 TCP 最关键的一个特征,也是借此来提供对连接可靠性的保证。TCP 连接上的字节流的每一个字节都有自己的一个 32 位序号。比方说,发送端发送了一个段,段头的序号为 1024,段的有效载荷大小为 1024。那么接收端在成功接收段后返回的确认消息中,确认号就会是 2048。确认号的值正好是接收端想要接收的下一个字节的序号,它已成功接收的最大序号为确认号-1。另外,如果字节流到达顺序错误,接收端也不会跨界返回确认,即小于接收端返回的确认号的字节流一定都是已成功接收的。

TCP头长度(TCP header length)字段指明了 TCP 头包含了多少个 32位的“字”,可以理解为上图中头的行数。这个字段的存在意义在于 TCP 头是变长的,因为他有一个可选的选项。技术上讲,这个字段实际指明了段中有效载荷的起始位置(以 32 位为单位),因此本字段也被称为 TCP 偏移量。当 TCP 头中没有选项时,本字段的值为 5。

接下来是长度为 4 位没有被使用的字段。

接着是 8 个 1 比特的标志位:

  • CWR 和 ECE 用于 RFC3186 说明的显式拥塞通知(ECN,Explicit Congestion Notification)信号;
  • URG 是紧急指针位,如果使用了紧急指针,就把本位置为 1;
  • ACK 被置为 1 表示确认号字段是有效的。如果为 0,则表示该段不包含确认信息,这时确认号字段被忽略;
  • PSH 表示这是被推送(PUSH)的数据,特此请求接收端不要缓冲本数据而是立即向上层提交;
  • RST 被用于突然重置一个已经变得混乱的连接,它也用来拒收无效段或拒绝连接请求;
  • SYN 用于建立连接的过程。它和 ACK 一起通过(1,0)和(1,1)的方式用于请求连接和接受连接;
  • FIN 用来释放连接。

窗口大小(window size)字段被接收端使用,用来动态指定从确认号起算,发送端还可以再发送多少个字节。这种窗口大小一般是由接收端的缓存限制的。

校验和(checksum)校验整个段,提供了额外的可靠性。

紧急指针(Urgent pointer)表示从当前序号开始找到紧急数据的字节偏移量。仅在 URG 为 1 时有效。

选项(Options)用于添加额外设施,主要针对常规头覆盖不到的方面。选项长度可变,但必须是 32 位的倍数,不足的用 0 补齐。这种规定有利于 TCP 头长度(TCP 偏移量)字段的使用。每个选项具有类型-长度-值(Type-Length-Value)编码。 <br /> ##HTTP

HTTP 是一个简单的请求—响应协议,通常运行于 TCP 之上。请求和响应两种消息的格式均为:起始行(start-line) + 消息头(message-header)(可选) + 消息体(message-body)(可选)。头域和消息体之间由一个空行来区分边界,头均为 ASCII 编码。 <br /> ###起始行 请求的起始行叫做请求行,它的格式为:请求方法,URI,HTTP版本。中间由空格间隔,就像这样:

GET http://www.w3.org/index.html HTTP/1.1

或者这样:

GET /index.html HTTP/1.1HOST:www.w3.org

第一种使用绝对 URI 的方式一般用在向代理服务器发送请求的时候,后一种用在向源服务器发送请求的时候。不过按 RFC2616 的规定,所有支持 HTTP/1.1 的服务器都应当可以解析第一种方式。

其他常用的请求方法还有:

响应的起始行叫做状态行,状态行包含了一个 3 位数字的状态码,用以指明请求是否被满足,比如:

HTTP/1.1 200 OK

全部状态码按第一位数字不同可大致分为 5 组:

<br /> ###消息头 消息头可以看成是对请求行的信息补充,可以为空,也可以包含多个字段。请求头通常交给服务器端脚本处理,可以类比为调用应用的参数。在 WSGI 中,使用一个响应头 + 一个状态码就足以初始化一个 HTTP 响应(不含消息体)。例:

Content-Type: text/html;charset=ISO-8859-1

其他消息头:

转载于:https://my.oschina.net/lionets/blog/227347

你可能感兴趣的文章
win7+ubuntu虚拟机之安装vmware tools步骤
查看>>
利用shell和iptables实现自动拒绝恶意试探连接SSH服务
查看>>
访问控制
查看>>
linux下oracle静默安装---亲测可以安装
查看>>
2016年4月8日作业
查看>>
SSL *** 安全解决方案
查看>>
linux进程的管理
查看>>
C++关键字(static-register-atuo-extern-volatile-const)
查看>>
jmeter-参数化与断言实战
查看>>
ios培训 教你清理ios项目不用的图片
查看>>
瞻博网络收购AppFormix“升级”的产品,听说财富500强企业都在用
查看>>
PHP 处理接口保证数据安全性
查看>>
如何使用Linux命令生成随机密码?
查看>>
Python语言能做什么?
查看>>
决心书
查看>>
Oracle定时执行计划任务
查看>>
SPI Flash的操作
查看>>
机械硬盘显示无法访问由于IO设备错误的资料找回方法
查看>>
网络工程师成长日记385-某银行线路优化
查看>>
Linux 系统日志、screen 工具
查看>>