HTTP协议

协议是什么???

协议:就是一种约定,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。

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端口;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记得多喝热水…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值