Linux http网络协议

N年前,去一家比较大型的公司面试,被面试官问到http返回的状态行里的数字404是什么意思,500是什么意思,403是什么意思,503是什么意思,我当时只知道200是正常返回,一时被问懵了。。。还有一次面试,被问到http头信息里都包含哪些东西,我当时就在想,丫的平时直接调用接口,用http请求,然后返回数据不就行了,问的这些又用不上,有什么意义,现在回想起来,可能是面试官想考察下是否真的理解了http协议,好了,今天我们就来好好的总结下:

http属于应用层的一种网络协议,在传输层依然是TCP,跟Socket不同,是短链接,一般情况下,每次请求之后,链接就断开了,HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消 息,因此减少了链接建立的次数和经常性的链接开销。

我们先来看下http报文信息中包含的内容:
Linux http网络协议_第1张图片

第一行是请求行,请求方法我们常用的POST,或者GET
第二行开始是头信息,用键: 值的形式表示
然后跟一个空行
最后是请求正文(一般POST方式数据存放在这里)

我们用httpwatch看一个请求报文的例子:
Linux http网络协议_第2张图片
这个例子是在浏览器中访问baidu网页的http请求报文
第一行请求行中,方法是GET,资源路径是/,http版本是HTTP/1.1
接下来是头信息
Accept:浏览器可以接收的内容类型
Accept-Language:语言
User-Agent:浏览器内核版本
Host:访问的URL
Connection:保持链接
Cookie:缓存

返回的报文的格式类似请求的报文:
Linux http网络协议_第3张图片
第一行是状态行,包含状态码
接下来是头信息
然后空一行
最后是返回的数据content,这里由于是进行了编码的,所以看到是乱码

头信息内容包含了返回数据的日期,返回内容的编码方式,输出的编码方式,设置的缓存等等,大家有兴趣,可以自己详细查下,我们这里主要看下状态码
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。

常见的说明如下:
200 OK:客户端请求成功。
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。

下面我们就在Linux中写一个简单的Http服务端。
Linux http网络协议_第4张图片
通过这个程序,大家可以知道http,其实也是通过Socket来实现的
这里我们利用浏览器的端口80,来直接返回一个helloworld

Linux http网络协议_第5张图片

如果我们想给用户返回一个html的文件,其实也很简单,在程序中先把html文件内容读取出来,然后直接返回,这里,我们下载好百度的html文件,然后直接返回
Linux http网络协议_第6张图片
这里写图片描述
执行结果:
Linux http网络协议_第7张图片
我们可以看到百度的结果出来了,但是为什么没有图片呢,因为我们只是把数据的文本给打开了,如果需要额外的图片,需要再额外请求。

我们这个Http服务超级简单,只是个返回,没有解析头信息进行处理,没有开启多线程进行处理,如果读者感兴趣,可以自己完善,这里的例子只是让大家明白这个一个过程。

好了,Linux http网络协议就总结到这里,如有问题,欢迎指正,谢谢。

你可能感兴趣的:(linux,linux)