协议是什么???
协议:就是一种约定,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。
Http协议(超文本传输协议)
- 设计http协议最初的目的是为了提供一种发布和接收HTML页面的方法,通过HTTP/HTTPS请求的资源由URL(统一资源定位符)来标识
- HTTP协议是在应用层协议
应用层是负责应用程序之间的数据沟通
HTTP协议格式
首行
- 请求首行:方法(GET/POST……)+URL+版本号(0.9/1.0/.1.1/2)
- 响应首行:版本号+状态码(1**/2**……)+状态码解释
头部(header)
- 请求的属性,冒号分割的键值对
- 每组属性之间使用\n分隔
- 遇到空行表示头部部分结束
空行
- \r\n(回车符和换行符)
正文(boy)
- 空行后面的内容都是正文,正文允许为空字符串,如果正文存在,则在头部中会有一个Content-Length属性来标识正文长度
- 如果服务器返回了一个html页面,那么html页面的内容就在正文中
以下就是一个简单的抓包操作
HTTP的方法
- GET:获取资源,向指定的资源发出“显示”请求(提交的数据放在URL中)
- POST:向指定的资源提交数据,请求服务器进行处理(例如提交表单或者上传文件),提交的数据放在正文中
- PUT:向指定资源位置上传其最新内容
- HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”
- DELETE:删除文件(删除指定的页面等)
- OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作
- TRACE: 回显服务器收到的请求,主要用于测试或诊断
- CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
- LINK:建立和资源之间的连接
- UNLINK:断开连接
HTTP状态码
常见的状态码: 200(OK), 404(Not Found), 403(Forbidden), 301(永杰重定向),302(Redirect, 重定向), 504(Bad Gateway)
HTTP头部(header)
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息,通常用于实现会话(session)的功能
常见知名服务器默认的端口
执行命令 cat /etc/services 可以查看知名端口号:
http服务器:80
https服务器:443
ssh服务器:22
telnet服务器:23
ftp服务器:21
注意:::
- HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer ,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。HTTPS不同于HTTP的是默认端口不同以及多一个加密/身份验证层(在HTTP与TCP之间)
- Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法
- SSH 为 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议*。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题
- FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。
实现一个简单的HTTP服务器
HTTP 是应用层协议,在传输层使用tcp协议实现传输
- 1.搭建tcp服务端程序
- 2.按照HTTP协议格式对接收的HTTP请求进行解析(解析的数据有,请求方法,uri,版本号,头部,正文)
- 3.根据请求uri对请求做出不同的处理
- 4.对客户端进行响应
不管客户端发送什么请求,统一响应
<html><body><h1>Hello World<h1></body></html>
简单服务器实现源码
#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], 就能看到显示的结果 “Hello World”
此时我们使用的是9090端口号,没有使用80端口;