原文地址:HTTP — an Application-Level Protocol

简介

在不丹,当人们见面时,他们通常用“你身体还好吗?”互相打招呼。在日本,根据当时的情形,人们可能会互相鞠躬。在阿曼,男人们在握手之后通常会互相亲吻对方的鼻子。在柬埔寨和泰国,人们常常双手合十像在祈祷一样。以上列举的这些都是一种通信协议,这是一种简单的代码序列,为双方进行有意义的交流做准备。

在互联网上,我们有一个非常高效的应用程序协议,为全世界的计算机准备好进行有意义的交流:超文本传输协议(Hypertext Transfer Protocol),即 HTTP。HTTP是在TCP/IP之上的一个应用级的协议,一个通信协议。在教授网页设计和开发时,HTTP常常被遗忘,这令人感到惭愧。因为了解HTTP将会有助于你定义更好的用户交互,获得更好的站点性能并创建高效的工具管理网络上的信息。

这是教授HTTP基础知识和怎样高效使用HTTP系列文章的第一篇。在这篇文章中,我们将讨论作为齿轮的HTTP是如何与互联网这个机器啮合的。

什么是通信协议?

在讨论详情之前,让我们考虑一个基本的通信场景。为了能够通信,双方(可以是软件、硬件、人等)需要:

语法(数据格式和编码格式)

语义(控制信息和错误处理)

适时性(快速匹配和队列)

当两个人见面时,他们会使用一种通信协议:比如,在日本,一个人会用身体做一个特定的姿势。这个姿势是鞠躬,这是用于交互的语法。在日本的风俗中,鞠躬这个姿势与欢迎某人的语义关联。最终,当一个人向另一个人鞠躬时,在特定的时间点一个事件队列就在双方之间产生了。

一个在线的通信协议包含同样的元素。语法将是字符的序列,例如我们用来编写协议的关键词。语义是与这些关键词相关联的含义,最后适时性是两个或多个实体交换这些关键词的顺序。

HTTP用在哪里?

HTTP本身在其他协议之上运行。当连接到一个网站时,比如网站www.example.org,用户代理使用协议的TCP/IP套件。TCP/IP模式是在1970年设计的,有4层:

1、Link,描述与物理介质的访问(比如,使用网卡)

2、Internet,描述数据的包装和路径 -- 他是如何打包的(IP)

3、Transport,描述数据从起点到终点的传输方式(TCP,UDP)

4、Application,描述传输的消息的含义和格式(HTTP)

HTTP是一个应用协议,处于通信协议的上层。这一点要牢记。将模式分割为相互独立的层有助于改进平台的各个部分,而无需重写全部内容。比如,TCP -- 传输协议,他可以在不修改HTTP协议的情况下独自进行改进。实际上,当我们努力进行高性能的通信时,细节会变得有点丑陋。在前几篇HTTP文章中,我们将重点关注TCP/IP模式中定义的层分离。HTTP被定义为在两个软件之间通过HTTP信息进行信息通信。我们塑造和设计这些消息的方式会对客户端(比如浏览器),服务器(网站),和他们的中介(代理)产生影响。

连接服务器

连接到网络服务器的默认端口是80端口。我们可以同过命令行工具验证这一点。打开你的命令行工具,使用下面的命令尝试在80端口上打开与www.opera.com的连接:
telnet www.opera.com 80

你会得到如下输出:

Trying 195.189.143.147...

Connected to front.opera.com.

Escape character is ‘^]’.

Connection closed by foreign host.

我们可以看到终端试图与IP地址为195.189.143.147的服务器通信。如果我们什么也不做,服务器会自动关闭这次连接。使用不同的端口和不同通信协议是完全可能的,但是上文所说的是最常用的。

说一说HTTP

我们再次与前面例子中的服务器通信。在命令行工具中输入下面命令:

telnet www.opera.com 80

一但连接产生,迅速输入下面的HTTP消息(在连接自动关闭前),然后按两次enter:

GET / HTTP/1.1

Host: www.opera.com

上面的HTTP消息指定:

GET:表示我们想要得到一个信息的表述。

/:表示我们想要得到的那个信息保存在这个站点的根目录下

HTTP/1.1:表示使用1.1版本的HTTP通信

Host:指定我想要访问的站点

www.opera.com:站点的名字

现在服务器开始相应了。在终端的窗口中你会看到如下内容:

HTTP/1.1 200 OK

Date: Wed, 23 Nov 2011 19:41:37 GMT

Server: Apache

Content-Type: text/html; charset=utf-8

Set-Cookie: language=none; path=/; domain=www.opera.com; expires=Thu, 25-Aug-2011 19:41:38 GMT

Set-Cookie: language=en; path=/; domain=.opera.com; expires=Sat, 20-Nov-2021 19:41:38 GMT

Vary: Accept-Encoding

Transfer-Encoding: chunked

<!DOCTYPE html>

<html lang="en">

服务器说“我使用1.1版本的HTTP通信。你的请求成功了,所以我使用状态码200响应。”字符串OK是可选的,是为了向人类解释这个状态码是什么意思--在这种情况下,一切正常而且我们的消息已经被接收了。然后发送一系列的HTTP headers来描述这个消息是什么,以及该怎样理解他。最后,以<!DOCTYPE html>开头的内容是站点根目录下保存的页面的内容。在接下来的几篇文章中将解释HTTP的关键词和代码列表。

后记

我们讨论了HTTP,他是如此简单!我们发送一个消息(就像写了一封信),然后我们收到一个回应,因为我们的消息被接收并解读了。下一次,我们将探索细节:这些头部信息和含义和该怎样使用它们。

[翻译]HTTP--一个应用级的协议的更多相关文章

  1. 我的翻译--一个针对TP-Link调试协议(TDDP)漏洞挖掘的故事

    前言 我写这篇文章原本是为了简化WiFi渗透测试研究工作.我们想使用去年由Core Security发布的WIWO,它可以在计算机网络接口和WiFi路由器之间建立一个透明的通道. 研究的第一步,就是选 ...

  2. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  3. 如何设计一个亿级网关(API Gateway)?

    1.背景 1.1 什么是API网关 API网关可以看做系统与外界联通的入口,我们可以在网关进行处理一些非业务逻辑的逻辑,比如权限验证,监控,缓存,请求路由等等. 1.2 为什么需要API网关 RPC协 ...

  4. python递归练习:生成一个n级深度的字典,例如:[1,2,3,4,5,6] 可以生成{1: {2: {3: {4: {6: 5}}}}},写一个函数定义n级

    结果#encoding = utf-8#题目:#生成一个n级深度的字典,例如:[1,2,3,4,5,6] 可以生成{1: {2: {3: {4: {6: 5}}}}},写一个函数定义n级a=[1,2, ...

  5. 有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?

    有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完? 相关问题: (1)有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台 ...

  6. iOS-runtime-根据协议名调某一个类有与协议里面放的相同的方法

    // // ViewController.m // ObserverTrampoline // // Created by Rob Napier on 9/7/11. // Copyright (c) ...

  7. 还在羡慕BAT等公司的大流量的架构吗,commonrpc 是一个以netty 传输协议框架为基础(支持FTP)

    还在羡慕BAT等公司的大流量的架构吗?让你的java系统引用解耦,互相独立,commonrpc 就可以办到.commonrpc 是一个以netty 传输协议框架为基础, 自定义 spring shce ...

  8. 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

  9. 基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇

    基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇 前提 最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的RPC框架如Spring Cloud Gateway底层也切换 ...

随机推荐

  1. UVa 1343 旋转游戏(dfs+IDA*)

    https://vjudge.net/problem/UVA-1343 题意:如图所示,一共有8个1,8个2和8个3,如何以最少的移动来使得中间8个格子都为同一个数. 思路:状态空间搜索问题. 用ID ...

  2. python 二进制数相加

    def add_binary_nums(x,y): max_len = max(len(x), len(y)) x = x.zfill(max_len) y = y.zfill(max_len) re ...

  3. Django2.0 URL配置

    一.实例 先看一个例子: from django.urls import path from . import views urlpatterns = [ path('articles/2003/', ...

  4. Docker 容器十诫

    [编者按]本文作者为 Rafael Benevides,主要介绍使用 Docker 容器时应该注意的十个陷阱. Docker 容器十诫 当你刚开始使用容器时,会发现容器能解决许多问题,而且好处很多: ...

  5. 对 Kotlin 与 Java 编程语言的思考

    从长远来看,排名前10的也基本上是Java.C.C++.Python.C#.VB.PHP.JavaScript.至于Kotlin的排名,11月份在编程语言仅排41名,Ratings仅有0.216%. ...

  6. js焦点事件:onfocus、onblur、focus()、blur()、select()

    焦点:使浏览器能够区分用户输入的对象,当一个元素有焦点的时候,那么他就可以接收用户的输入只有能够响应用户操作额元素才可以接收焦点事件,比如:a button input... onfocus:当元素获 ...

  7. node 工程化 web项目

    1.结构 node_modules   ( ... ) routers     ( main.js  ) views    ( index.html   about.HTML  404.html ) ...

  8. Android系统广播处理机制

    Android系统中的广播是广泛用于应用程序之间通信的一种手段,它类似于事件处理机制,不同的地方就是广播的处理是系统级别的事件处理过程(一般事件处理是控件级别的).在此过程中仍然是离不开Intent对 ...

  9. Codeforces 101487E - Enter The Dragon

    101487E - Enter The Dragon 思路:做的时候两个地方理解错了,第一个事我以为龙吸了水,水就干了,其实龙是在下雨之前吸的,下雨时湖水又满了,所以湖水永远不会干:第二个是以为只要找 ...

  10. 利用Py-Socket模块做的一个不登陆windows服务器自动实现替换或者调用自动拨号功能

    xu言: 最近,有个朋友让我帮忙“搞点事情”,然后正好在学习socket模块,这个模块666啊,基本上可以实现远程服务器cmd shell的大部分功能.好,话不多说,直接上码~ 由于很多电信运营商都会 ...