首先HTTP协议属于应用层协议,应用层协议就是我们程序员自己定协议,但如果每次都自己定麻烦并且很容易出错,所以有了一些现成的(HTTP,DNS)等,所以大多是直接拿来用就行,而应用层的作用就是双方达成某种约定,一段按照约定的协议发送数据,另一端按照约定来解析数据,保证接收数据的一段可以正确解析数据,这就是应用层的作用,也是HTTP协议的作用之一。 

HTTP协议的格式

HTTP协议分为HTTP请求和HTTP响应

 

 

HTTP请求

 

深入理解HTTP协议

深入理解HTTP协议

 

 

说明:

 

  1. 第一部分为第一行,为请求行,请求行以空格分为三个区域,第一个区域叫请求方法,常见方法为POST,GET方法;第二个区域指明想要访问放入资源(通常以路径的形式呈现,网页也属于文件)第三个区域表示HTTP协议的版本(常见1.0/1.1)
  2. 第二部分从第二行开始,一直到空行前面称为请求报头(Header)。每一行都代表一个特点含义,每一行格式都是name:value
  3. 第三部分为空行,目的是为了将请求正文和请求行,请求报头分隔开(读到空格表示请求行和请求报头读完)
  4. 第四部分为请求正文(Body可以为空,请求报头中的content_length表示正文大小)

HTTP响应

 

深入理解HTTP协议

 

说明:

 

  1. 第一部分为第一行,为响应行,也分为三个区域,用空格间隔,第一个区域代表协议版本;第二个区域表示状态码;第三个区域为状态码解释
  2. 第二部分从第二行开始,一直到空格之前称为响应报头,每一行都代表一个特点含义,每一行格式都是name:value
  3. 第三部分为空行,目的是为了将响应正文和状态行,响应报头分隔开(读到空格表示状态行和响应报头读完)
  4. 第四部分为响应正文(Body可以为空,响应报头中的content_length表示正文大小)

实现一个简单的HTTP服务器

 
  1. #include <unistd.h>

  2. #include <string.h>

  3. #include <sys/types.h>

  4. #include <sys/socket.h>

  5. #include <netinet/in.h>

  6. #include <arpa/inet.h>

  7. #include <stdio.h>

  8.  
  9. void serviceIO(int sock)

  10. {

  11. char buf[10240];

  12. ssize_t s=read(sock,buf,sizeof(buf)-1);

  13. if(s>0){

  14. buf[s]=0;

  15. printf("%s",buf);

  16. }

  17. const char *echo="HTTP/1.1 200 OK\r\n\r\n<html><h1>hello world!</h1></html>";

  18. write(sock,echo,strlen(echo));

  19. close(sock);

  20. }

  21.  
  22.  
  23. int main(int argc,char *argv[])

  24. {

  25. if(argc != 3){

  26. printf("Usage: %s [ip] [port]\n",argv[0]);

  27. return 1;

  28. }

  29.  
  30. int listen_sock=socket(AF_INET,SOCK_STREAM,0);

  31. if(listen_sock<0){

  32. perror("sock");

  33. return 2;

  34. }

  35.  
  36. struct sockaddr_in local;

  37. local.sin_family=AF_INET;

  38. local.sin_port=htons(atoi(argv[2]));

  39. local.sin_addr.s_addr=inet_addr(argv[1]);

  40.  
  41. if(bind(listen_sock,(struct sockaddr*)&local,sizeof(local))){

  42. perror("bind");

  43. return 3;

  44. }

  45.  
  46. int s=listen(listen_sock,5);

  47. if(s<0){

  48. perror("listen");

  49. return 4;

  50. }

  51.  
  52. for( ; ;){

  53. struct sockaddr_in client;

  54. socklen_t len=sizeof(client);

  55. int sock=accept(listen_sock,(struct sockaddr*)&client,&len);

  56. if(sock<0){

  57. perror("accept");

  58. continue;

  59. }

  60. printf("get a new link [%s:%d]...!\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));

  61.  
  62. serviceIO(sock);

  63. }

  64. return 0;

  65. }

首先的关闭防火墙:service iptables stop

 

运行服务器

深入理解HTTP协议

 

在浏览器上输入自己的ip地址

 

深入理解HTTP协议

深入理解HTTP协议

 

转载:https://blog.csdn.net/running987/article/details/81429984

相关文章: