1、 telnet的使用

在一般的场景中,我们都使用telnet来测试一个端口的连通性,但是也是可以使用telnet来进行发送HTTP请求,如下所示:

[root@rsyncserver~]# netstat -tnlp|grep httpdhttpd监听了80端口

tcp        0     0 :::80             :::*         LISTEN      1368/httpd         

[root@rsyncserver~]# telnet 192.168.1.70 80 使用telnet来连接80端口

Trying192.168.1.70...

Connected to192.168.1.70.

Escape characteris '^]'. (已连接上80端口)

GET / HTTP/1.1  发送HTTP请求

HOST:www.kel.com区分不同的虚拟主机

 

HTTP/1.1 200 OK 收到HTTP的响应报文

Date: Mon, 19Dec 2016 16:59:04 GMT

Server: Apache/2.4.23(Unix)

X-Powered-By:PHP/5.5.38

Transfer-Encoding:chunked

Content-Type:text/html

 

c      响应的内容主体

susceess

0

 

Connectionclosed by foreign host.

在进行查看连接的时候,显示如下:

[root@rsyncserverkel.com]# netstat -an |grep "192.168.1.70:80"表示连接上端口,等待发送请求

tcp        0     0 192.168.1.70:80   192.168.1.11:49592         SYN_RECV   

[root@rsyncserverkel.com]# netstat -an |grep "192.168.1.70:80" 建立连接之后,收到请求,回复请求

tcp        0     0 ::ffff:192.168.1.70:80   ::ffff:192.168.1.11:49592  ESTABLISHED

[root@rsyncserverkel.com]# netstat -an |grep "192.168.1.70:80" 连接即将断开

tcp        0     0 ::ffff:192.168.1.70:80   ::ffff:192.168.1.11:49592  TIME_WAIT

 

2、 关于HTTP协议

在使用telnet的时候,使用了HTTP协议的请求与响应,HTTP的请求格式如下:

<method><url> <version>

报文首部

空行

请求的主体

HTTP响应的格式如下:

<version><status> <reason-message>

报文首部

空行

返回的信息主体

 

报文的第一行称之为起始行,首部域的格式主要是namevalue,使用冒号进行分割,空行主要用来表示报文首部结束,响应报文还有响应的报文的主体,在上面telnel中,也就是httpd进程返回的html文档。

Method方法一般如下所示:

GET:服务器向客户端发送请求的资源

PUT:将客户端的数据存储到服务器的资源中

DELETE:将服务器中删除一些资源

POST:将客户端数据发送到服务器网关程序

HEAD:仅发送资源响应中的首部信息

状态码:

200:表示成功类型信息,一般显示为OK

3XX:重定向类的信息,例如301永久重定向,302临时重定向,304使用缓存

4XX:客户端错误信息,例如404表示页面未找到

5XX:服务端错误信息,例如500服务器内部错误



3、 虚拟主机

在一般的场景中,都是一台物理机部署一个站点,就是使用IP和端口标识唯一的主机,但是在虚拟主机中,也就是一太物理机上部署很多个虚拟站点,使用虚拟站点的时候,可以使用三种方式:


HTTP协议是建立在TCP/IP协议之上的,TCP/IP协议主要是根据IP地址和PORT来唯一确定一台主机的通信,那么基于域名的虚拟主机的实现,怎么来区分不同的虚拟站点(两个站点的IP地址和端口完全一样)?

查看如下的telnet例子:

[root@rsyncserver~]# telnet 192.168.1.70 80

Trying192.168.1.70...

Connected to192.168.1.70.

Escape characteris '^]'.

GET / HTTP/1.1 未指定虚拟主机的域名,无法找到相应的站点

 

HTTP/1.1 400 Bad Request

Date: Mon, 19Dec 2016 17:56:03 GMT

Server:Apache/2.4.23 (Unix)

Content-Length:226

Connection:close

Content-Type:text/html; charset=iso-8859-1

 

<!DOCTYPEHTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<html><head>

<title>400 Bad Request</title>

</head><body>

<h1>BadRequest</h1>

<p>Yourbrowser sent a request that this server could not understand.<br />

</p>

</body></html>

Connectionclosed by foreign host.

可以看到,在使用HTTP协议的时候,请求报文的首部会包含一个HOST:www.kel.com,也就是指定虚拟主机名称,从而根据HTTP协议的首部HOST找到对应的站点,从而访问对应的资源。


4、 服务器处理模型

第一种处理模型为,单进程/单线程来处理请求(会阻塞其他的请求):


第二个处理模型为,多进程/多线程处理一个请求:


第三个处理模型为,一个进程处理多个请求,这个进程为管理进程,而真正工作的为线程:


第四个处理模型为,多个进程处理多个请求,会启动几个管理进程,每个进程又启动多个线程:


当一个进程里有多个线程的时候,那么怎么来判断线程是否空闲,主要就是使用到事件驱动的方式,也就是当一个线程处理请求完成之后,这个线程的状态发生改变,通知进程,线程在空闲中。

WEB服务器中,服务器主要做的操作如下所示:

1、建立连接--接受或拒绝客户端连接请求

2、接受请求--通过网络读取HTTP请求报文

3、处理请求--解析请求

4、访问资源--访问请求中的相关资源

5、构建响应--使用正确的首部生成HTTP响应报文

6、发送相应--向客户端发送生成的响应报文

7、记录日志--把已经完成的HTTP日志信息记录在日志文件中


©著作权归作者所有:来自51CTO博客作者mb5fdb131956bf3的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 带你深入熟悉你所不知道的ICMP
  2. Nginx Ingress的一些奇巧淫技
  3. 让DNS运行在容器中
  4. 控制器访问与参数解析类以及api天气接口实现输入城市查询天气
  5. PHP: 解析pathinfo(从url解析控制器和方法) 和 cUrl的简单应用
  6. jqueryDom操作与ajax请求
  7. 面试官:说说你之前负责的系统,QPS 能达到多少?
  8. 阿里问题定位神器 Arthas 的骚操作,定位线上BUG,超给力!
  9. 扎心一问:前后端分离开发,RESTful 接口要怎样设计?

随机推荐

  1. 聊聊对账系统的设计方案
  2. 还不知道如何使用 IDEA ?教你三招快速掌握
  3. 聊聊如何从零开始自学编程
  4. 从源码解析 Spring JDBC 异常抽象
  5. 为什么将 Intellij IDEA 作为日常开发的
  6. 支付路由系统演进史
  7. 小心递归中内存泄漏
  8. 想来微软实习吗?
  9. 我是怎么把博客粉丝转到公众号的
  10. 如何更好地结构化表示一个 URL?