HTTP协议介绍 记录

WWWC最终发布了一系列的RFC,其中最著名的就是RFC 2616。RFC 2616定义了HTTP协议的我们今天普遍使用的一个版本——HTTP 1.1。

尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。

通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。

HTTP使用TCP而不是UDP的原因在于(打开一个)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正

请求信息(Request Message)
引用

发出的请求信息包括以下几个

    * 请求行,例如GET /images/logo.gif HTTP/1.1,表示从/images 目录下请求logo.gif 这个文件。
    * (请求)头,例如Accept-Language: en
    * 空行
    * 可选的消息体

请求行和标题必须以<CR><LF> 作为结尾(也就是,回车然后换行)。空行内必须只有<CR><LF>而无其他空格。在HTTP/1.1 协议中,所有的请求头,除Host外,都是可选的。

请求方法(Request Methods)
引用

HTTP协议中定义了八种方法(有时也叫“动作”)来表示对指定数据的操作。

HEAD

    (Head方法)要求响应与相应的GET请求的响应一样,但是没有的响应体(response body)。这用来获得响应头(response header)中的
    元数据信息(meta-infomation)有(很)帮助,(因为)它不需要传输所有的内容。

GET

   (Get方法用来)请求指定的资源。它是目前网上最常用的方法。它不应该用于一些会造成副作用的操作中
   (在网络应用中用它来提交动作是一种常见的错误用法)。(细节请)参考后面的“安全方法”(这一节)。

POST

   (POST方法用来)向指定的资源提交需要处理的数据。这些数据写在请求的内容里。(POST请求)可以导致新资源的产生和已有资源的更新。

PUT

   上传指定资源

DELETE

   删除指定资源

TRACE

   (Trace方法告诉服务器端)返回收到的请求。客户端可以(通过此方法)察看在请求过程中中间服务器添加或者改变哪些内容。

OPTIONS

   返回服务器(在指定URL上)支持的HTTP方法。通过请求“*”而不是指定的资源,这个方法可以用来检查网络服务器的功能。

CONNECT

   将请求的连接转换成透明的TCP/IP通道,通常用来简化通过非加密的HTTP代理的SSL-加密通讯(HTTPS)。

HTTP服务器至少应该实现Get和Head方法,可能的话,也实现OPTIONS方法。

安全方法

有些方法(比如HEAD, GET, OPTIONS, and TRACE) 被定义为安全方法,这些方法针对的只是信息的返回,并不会改变服务器的状态(换句话说就是这些方法不会产生副作用)。不安全的方法(例如POST, PUT and DELETE) 应该用特殊的方式向用户展示,通常是按钮而不是链接,这样就可以使用户意识到可能要负的责任(例如一个按钮带来的资金交易。)

状态行

引用

所有 HTTP 响应的第一行都是状态行, 依次是当前 HTTP 版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

状态代码的第一个数字代表当前响应的类型:

    * 1xx 消息——请求已被服务器接收,继续处理
    * 2xx 成功——请求已成功被服务器接收、理解、并接受
    * 3xx 重定向——需要后续操作才能完成这一请求
    * 4xx 请求错误——请求含有词法错误或者无法被执行
    * 5xx 服务器错误——服务器在处理某个正确请求时发生错误

虽然 RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是 WEB 开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二:实验目标 1. 理解HTTP协议及其工作原理; 2. 熟悉Berkeley套接字API,了解socket编程; 3. 掌握使用Python语言实现HTTP代理; 4. 能够通过配置Web浏览器将个人代理服务器用作Web代理。 三:实验内容 本实验主要有以下几个步骤: 1. 了解HTTP协议及其工作原理; 2. 熟悉Berkeley套接字API,了解socket编程; 3. 使用Python语言实现简单的HTTP代理; 4. 配置Web浏览器将个人代理服务器用作Web代理; 5. 测试HTTP代理的功能。 四:实验原理 HTTP(超文本传输协议)是一个用于传输超媒体文档(例如HTML)的应用层协议,是TCP/IP协议族中最重要的协议之一。HTTP是一种无状态协议,每个请求都是独立的,服务器不会记录任何客户端的信息。 HTTP代理是一种在客户端和服务器之间充当中介的服务器,它接收来自客户端的请求,然后将请求发送到服务器,并将服务器的响应返回给客户端。HTTP代理可以用于多种目的,例如提高性能、加强安全性等。 在实现HTTP代理时,需要使用Berkeley套接字API,它是一组用于网络编程的系统调用和库函数。使用Berkeley套接字API,可以创建和管理套接字,套接字是用于在网络上进行数据传输的数据结构。 五:实验步骤 1. 了解HTTP协议及其工作原理。 HTTP协议是一种无状态协议,在每个请求和响应之间不会保留任何信息。HTTP协议使用TCP作为传输协议,使用80端口进行通信。HTTP请求由请求行、请求头和请求主体组成,例如: ``` GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 ``` HTTP响应由状态行、响应头和响应主体组成,例如: ``` HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1354 <!DOCTYPE html> <html> <head> <title>Example</title> </head> <body> <p>Hello, World!</p> </body> </html> ``` 2. 熟悉Berkeley套接字API,了解socket编程。 Berkeley套接字API提供了一组用于网络编程的系统调用和库函数,包括创建和管理套接字、绑定地址和端口、监听连接请求、建立连接、发送和接收数据等操作。 Python提供了socket库,它是对Berkeley套接字API的封装,提供了简单易用的接口。使用socket库,可以创建TCP服务器和客户端,代码示例如下: ``` # 创建TCP服务器 import socket server_address = ('localhost', 8000) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(server_address) server_socket.listen(1) while True: client_socket, client_address = server_socket.accept() request_data = client_socket.recv(1024) response_data = b'Hello, World!' client_socket.send(response_data) client_socket.close() # 创建TCP客户端 import socket server_address = ('localhost', 8000) client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(server_address) request_data = b'Hello, World!' client_socket.send(request_data) response_data = client_socket.recv(1024) print(response_data.decode()) client_socket.close() ``` 3. 使用Python语言实现简单的HTTP代理。 可以使用Python语言实现一个简单的HTTP代理,代码示例如下: ``` import socket import threading class ProxyServer: def __init__(self, address): self.server_address = address self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.bind(self.server_address) self.server_socket.listen(5) def start(self): while True: client_socket, client_address = self.server_socket.accept() threading.Thread(target=self.handle_request, args=(client_socket,)).start() def handle_request(self, client_socket): request_data = client_socket.recv(1024) host, port = self.parse_request(request_data) if port == 80: server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = (host, port) server_socket.connect(server_address) server_socket.send(request_data) response_data = server_socket.recv(1024) client_socket.send(response_data) server_socket.close() client_socket.close() def parse_request(self, request_data): request_str = request_data.decode() lines = request_str.split('\r\n') line1 = lines[0] parts = line1.split(' ') host = '' port = 80 for part in parts: if part.startswith('http://'): host = part[7:] elif ':' in part: host, port = part.split(':') port = int(port) return host, port if __name__ == '__main__': proxy_server = ProxyServer(('localhost', 8000)) proxy_server.start() ``` 4. 配置Web浏览器将个人代理服务器用作Web代理。 可以使用Chrome浏览器测试HTTP代理的功能,具体步骤如下: 1. 打开Chrome浏览器,点击右上角的菜单按钮; 2. 选择“设置”选项; 3. 点击“高级”选项; 4. 找到“代理设置”选项,点击“打开代理设置”按钮; 5. 在“局域网设置”中勾选“使用代理服务器”,并填写个人代理服务器的IP地址和端口号; 6. 点击“确定”按钮保存设置。 5. 测试HTTP代理的功能。 在配置完Web浏览器后,可以测试HTTP代理的功能。在Chrome浏览器中输入一个网址,例如“http://www.example.com”,如果HTTP代理正常工作,就能够正常访问该网站。 六:实验总结 本实验主要介绍HTTP协议及其工作原理,Berkeley套接字API,以及使用Python语言实现简单的HTTP代理的方法。通过本实验,可以更深入地了解网络编程和HTTP协议,同时提高编程能力和实践能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值