1.HTTP协议(超文本传输协议)是一个应用层的协议
。
2.认识URL
平时我们所说的网址就是URL
urlencode和urldecode
像/?:等这样的字符,已经被url当作特殊意义理解了。因此这些字符不能随便出现。比如,某个参数中需要带有这写特殊字符,就必须先对特殊字符进行转义。
转移的规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。urlencode就是起的编码作用。
urldecode就是urlencode的反过程,解码已编码的url字符串。
3.HTTP协议格式
3.1HTTP请求
-
首行:[方法]+[url]+[版本]
-
Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束。
-
Body:空行后面的内容都是Body。Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度。
3.2HTTP响应
-
首行:[版本号]+[状态码]+[状态码解释]
-
Header:请求的属性,冒号分隔的键值对,每组属性之间使用\n分隔,遇到空行表示Header部分结束。Content-Length属性来标识Body的长度;如果服务器返回了一个html页面,那么html页面内容就是在body中。
3.3http数据的解析过程
1.获取http头部,(首行+头部)
首行中包含url可以知道客户端请求什么资源,GET请求还可以获取到提交的数据
首行中包含的协议版本:拿到版本就可以针对不同版本的特性进行处理
2.解析头部
可以获取正文有多长,正文是什么类型的数据
3.获取正文进行处理(通常将正文交给子进程处理)
4.HTTP的方法
GET:获取资源
POST:传输实体主体
PUT:传输文件
HEAD:获得报文头部
DELETE:删除文件
其中最常用的就是GET和POST方法
5.HTTP的状态码
1XX
|
信息性状态码(接受的请求正在处理)
|
2XX
|
成功状态码(请求正常处理完毕)
|
3XX
|
重定向状态码(需要进行附加操作以完成请求)
|
4XX
|
客户端错误状态码(服务器无法处理请求)
|
5XX
|
服务器状态错误码(服务器处理请求出错)
|
最常见的状态码:比如200(ok),404(Not Found),403(Forbidden),302(重定向),504等。
6.HTTP常见Header
-
Content-Type:数据类型(text/html等)。
-
Content-Length:Body的长度。
-
Host:客户端告知服务器,所请求资源是在哪个主机的哪个端口上;
-
User-Agent:声明用户的操作系统和浏览器版本信息。
-
referer:当前页面是从哪个页面跳过来的。
-
location:搭配3XX状态码使用,告诉客户端接下来要去哪里访问。
-
Cookie:用于在客户端存储少量信息,通常用于实现会话的功能。
7.实现一个最简单的HTTP服务器
实现一个最简单的http服务器,只在ww网页上输出“hello world”;
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void Usage() {
printf("usage: ./server [ip] [port]\n");
int main(int argc, char* argv[]) {
if (argc != 3) {
Usage();
return 1;
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {
perror("socket");
return 1;
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(argv[1]);
addr.sin_port = htons(atoi(argv[2]));
int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
if (ret < 0) {
perror("bind");
return 1;
ret = listen(fd, 10);
if (ret < 0) {
perror("listen");
return 1;
for (;;) {
struct sockaddr_in client_addr;
socklen_t len;
int client_fd = accept(fd, (struct sockaddr*)&client_addr, &len);
if (client_fd < 0) {
perror("accept");
continue;
char input_buf[1024 * 10] = {0};
ssize_t read_size = read(client_fd, input_buf, sizeof(input_buf) - 1);
if (read_size < 0) {
return 1;
printf("[Request] %s", input_buf);
char buf[1024] = {0};
const char* hello = "<h1>hello world</h1>";
sprintf(buf, "HTTP/1.0 200 OK\nContent-Length:%lu\n\n%s", strlen(hello), hello);
write(client_fd, buf, strlen(buf));
return 0;
编译,启动服务,在浏览器中输入http://[ip]:[port],就可以看到结果显示在页面上。
应用层的功能:
应用层负责应用程序之间的沟通来制定协议,通俗的来讲,就是应用层会借助TCP,UDP协议在各种各样的程序之间传递数据(邮件,文件等)这时候像应用层协议就可以规定这些数据的格式要满足什么样的。
常见的应用层协议:
基于UDP的应用层协议:
DHCP:动态主机配置协议
DNS:域名解析协议
基于TCP的应用层协议:
SMTP:
简单电子邮件传输协议
FTP:文件传输协议
从代码逻辑我们可以很清晰的看出简单的http服务器锁遵循的框架,以及后台调用的过程
并在此,应用了,多进程,进程间通信的管道,以及网络通信socket的知识/*************************************************************************
> File Name: httpd.c
> Author:Victor Qi
用Java实现一个简单的HTTP服务器(一)一、HTTP协议简介二、HTTP工作原理三、HTTP请求方法四、HTTP状态码五、URL六、HTTP请求协议七、HTTP响应协议总结
简介:这学期报了计网创新的创新实验,在机房做基于交换机和路由器的计网实验。最近正在学Java,想用Java实现一个简单的HTTP服务器,接下来就是我的心路历程.
一、HTTP协议简介
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)
是一种用于分布式、协作式和超媒体信息系统的应用层协议。
生活中充满了各种网站,那么网站的基础HTTP协议是什么样的,平时都是使用网页,或者看书上说HTTP协议。最近讲实现HTTP到Webservice系列协议的简单程序,并且开发代码,供爱学习的人理解HTTP协议到Webservice协议。
本次开发使用NetCore5.0,实现的服务可以运行在linux和windows。原理通了只要有精力任何有tcp的开发语言都能自己实现http服务器,不限于C#,可以用C、C++、Java、等等自己实现HTTP服务器。目前比较简单,抓紧学习(哈哈)
代码地址:https://
应用程序的入口在HttpServer类中。main()方法创建一个HttpServer实例,然后调用await()方法。服务器会在指定的端口上等待HTTP请求,对其进行处理,然后发送响应信息回客户端。
package com.forcht.webApplication;
import java.io.File;
import java.io.IOException;
import java.i...
1 HTTP协议简介
在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP,所以:
HTML(超文本标记语言,HyperText Markup Language 的简称)是一种用来定义网页的文本;
HTTP(超文本传输协议,HyperText Transfer Protocol 的简称)是在网络上传输H...
简单http协议1.HTTP协议简介1.1定义1.2特点1.3Http请求与响应报文分析1.4一次完整的http事务过程2.session与cookie2.1session 简介2.2cookie简介3.http与和https的区别3.1https简介
1.HTTP协议简介
1.1定义
1.2特点
1.3Http请求与响应报文分析
1.4一次完整的http事务过程
2.session与cookie...
**POST: 传输实体主体****PUT:传输文件**
**HEAD:获得报文首部**
**DELETE:删除文件***OPTIONS: 问支持的方法****TRACE: 追踪路径**
**CONNECT: 要求用隧道协议连接代理*六、使用方法下达命令
七、持久连接节省通信等等