了解HTTP协议吗?golang HTTP库实现?

题目来源:字节跳动

答案:

HTTP是超文本传输协议(Hypertext Transfer Protocol)的英文缩写,是基于TCP/IP通讯协议之上用来传输HTML和图片文件的应用协议。

HTTP工作步骤:

  1. 用户输入地址后回车或点击链接
  2. 浏览器拼装 HTTP 报文并发送请求给服务器
  3. 服务器处理请求后发送响应报文给浏览器
  4. 浏览器解析响应报文并使用渲染引擎显示到界面

HTTP请求:HTTP请求是客户端往服务端发送请求动作,告知服务器自己的要求。HTTP请求由状态行、请求头、请求正文三部分组成:

  • 状态行:包括请求方式Method、资源路径URL、协议版本Version;
  • 请求头:包括一些访问的域名、用户代理、Cookie等信息;
  • 请求正文:就是HTTP请求的数据。

HTTP响应:服务器收到了客户端发来的HTTP请求后,根据HTTP请求中的动作要求,服务端做出具体的动作,将结果回应给客户端,称为HTTP响应。HTTP响应由三部分组成:状态行、响应头、响应正文;

  • 状态行:包括协议版本Version、状态码Status Code、回应短语;

  • 响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;

  • 响应正文:就是响应的具体数据。

    常见状态码的含义:

    200—OK/请求已经正常处理完毕

​ 301—/请求永久重定向

​ 302—/请求临时重定向

​ 304—/请求被重定向到客户端本地缓存

​ 400—/客户端请求存在语法错误

​ 401—/客户端请求没有经过授权

​ 403—/客户端的请求被服务器拒绝,一般为客户端没有访问权限

​ 404—/客户端请求的URL在服务端不存在

​ 500—/服务端永久错误

​ 503—/服务端发生临时错误

golang可用net/http库来实现http协议操作,net/http处理Http请求的基本流程:

  • 服务端创建socket,绑定并监听指定的IP地址和端口;ListenAndServer(…)
  • 客户端与Listen Socket连接,确认请求后,客户端得的Client Socket,客户端通过这个与Listen Socket通信;srv.Server(…)
  • 服务端创建一个go程来处理客户端请求,读取header和数据,交给相应的handler处理,结果通过Client Socket交给客户端;c.server(…)