深入理解万维网:URL、HTTP与HTML
- 统一资源定位符(URL)
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 | 本地文件协议 | 访问本地文件 |
- HTTP与HTTPS协议
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
<!DOCTYPE html>
<html>
...
</html>
- HTTP方法
方法 | 描述 |
---|---|
GET | 获取资源 |
POST | 提交数据 |
PUT | 更新资源 |
DELETE | 删除资源 |
HEAD | 获取头部信息 |
OPTIONS | 查询服务器支持的方法 |
- HTTP状态码
5.1 状态码分类
分类 | 描述 |
---|---|
1xx | 信息响应 |
2xx | 成功响应 |
3xx | 重定向 |
4xx | 客户端错误 |
5xx | 服务器错误 |
5.2 常见状态码
状态码 | 描述 |
---|---|
200 | 请求成功 |
301 | 永久重定向 |
404 | 资源未找到 |
500 | 服务器内部错误 |
- HTML基础
6.1 HTML文档结构
html
<!DOCTYPE html>
<html>
<head>
<title>页面标题</title>
</head>
<body>
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
</body>
</html>
6.2 常见HTML元素
• <h1>
-<h6>
:标题
• <p>
:段落
• <a>
:超链接
• <img>
:图像
• <div>
:块级容器
• <span>
:行内容器
- 使用Socket实现HTTP通信
7.1 基础Socket实现
c
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
// 创建套接字
int fd = socket(AF_INET, SOCK_STREAM, 0);
// 绑定地址
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(8080),
.sin_addr.s_addr = INADDR_ANY
};
bind(fd, (struct sockaddr *)&addr, sizeof(addr));
// 监听并接受连接
listen(fd, 5);
int cfd = accept(fd, NULL, NULL);
// 处理请求
char buf[BUFSIZ];
recv(cfd, buf, BUFSIZ, 0);
printf("%s\n", buf);
// 关闭连接
close(cfd);
close(fd);
return 0;
}
7.2 处理GET请求
c
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;
}