深入理解万维网:URL、HTTP与HTML
1.1 什么是URL?
统一资源定位符URL(Uniform Resource Locator)是万维网上用于标识和定位各种文档的标准方法,它使每个资源在互联网范围内具有唯一标识。
示例URL:
https://www.makeru.com.cn:443/index.html
1.2 URL语法结构
scheme://host.domain:port/path/filename
• scheme - 定义因特网服务类型
• host - 定义域主机(默认www)
• domain - 定义因特网域名
• port - 定义主机端口号
• path - 定义服务器路径
• filename - 定义资源名称
1.3 常见URL Scheme
Scheme | 描述 | 用途 |
---|---|---|
http | 超文本传输协议 | 普通网页,不加密 |
https | 安全超文本传输协议 | 加密的安全网页 |
ftp | 文件传输协议 | 文件上传下载 |
file | 本地文件协议 | 访问本地文件 |
2.1 HTTP协议基础
HTTP(Hypertext Transfer Protocol)是用于分布式、协作式超媒体信息系统的应用层协议。
特点:
• 基于TCP/IP通信协议
• 默认端口80
• 无状态协议
• 使用请求-响应模型
2.2 HTTPS协议
HTTPS(Hypertext Transfer Protocol Secure)是HTTP的安全版本:
• 添加SSL/TLS加密层
• 默认端口443
• 提供数据加密、完整性校验和身份验证
2.3 HTTP请求-响应流程
建立TCP连接
客户端发送HTTP请求
服务器处理请求
服务器返回HTTP响应
关闭连接(HTTP/1.1默认保持连接)
HTTP消息结构
3.1 HTTP请求消息
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
3.2 HTTP响应消息
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Content-Type: text/html
Content-Length: 143
...
方法 | 描述 |
---|---|
GET | 获取资源 |
POST | 提交数据 |
PUT | 更新资源 |
DELETE | 删除资源 |
HEAD | 获取头部信息 |
OPTIONS | 查询服务器支持的方法 |
5.1 状态码分类
分类 | 描述 |
---|---|
1xx | 信息响应 |
2xx | 成功响应 |
3xx | 重定向 |
4xx | 客户端错误 |
5xx | 服务器错误 |
5.2 常见状态码
状态码 | 描述 |
---|---|
200 | 请求成功 |
301 | 永久重定向 |
404 | 资源未找到 |
500 | 服务器内部错误 |
6.1 HTML文档结构
DOCTYPE html>
<html>
<head>
<title>页面标题title>
head>
<body>
<h1>我的第一个标题h1>
<p>我的第一个段落。p>
body>
html>
6.2 常见HTML元素
• -
:标题
• :段落
•
:图像
• • 7.1 基础Socket实现 7.2 处理GET请求:行内容器
#include
int do_get(int fd, char *buf, size_t len) {
char type[16], resource[16];
sscanf(buf, "%s%s\n", type, resource);
if(strncasecmp("GET", type, 3)) {
send(fd, "HTTP/1.1 501 Not Implemented\r\n\r\n", 29, 0);
return -1;
}
char *pathname = (strlen(resource) == 1 && resource[0] == '/') ?
"index.html" : &resource[1];
FILE *fp = fopen(pathname, "r");
if(!fp) {
send(fd, "HTTP/1.1 404 Not Found\r\n\r\n", 26, 0);
return -1;
}
char response[BUFSIZ];
fread(response, 1, len, fp);
char header[1024];
sprintf(header, "HTTP/1.1 200 OK\r\n"
"Content-Length: %ld\r\n"
"Content-Type: text/html\r\n\r\n", strlen(response));
send(fd, header, strlen(header), 0);
send(fd, response, strlen(response), 0);
fclose(fp);
return 0;
}