HTTP_Server

Web服务器是基于HTTP实现的,而HTTP协议是运行在TCP之上的。所以在创建TCP连接这个过程是与C/S的过程是相似的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//创建服务		
int client_socket = -1;
int server_socket = -1;
u_short port = 8080;
struct sockaddr_in client_name;
int len = sizeof(client_socket);

struct sockaddr_in server_name;
pthread_t newthread;

//PF_INET
if((server_socket = socket(PF_INET,SOCK_STREAM,0)) < 0){
perror("socket");
return 1;
}
memset(&server_name,0,sizeof(server_name));
server_name.sin_addr.s_addr = htonl(INADDR_ANY);
server_name.sin_family = AF_INET;
server_name.sin_port = htons(port);

if(bind(server_socket, (struct sockaddr*)&server_name, sizeof(server_name)) < 0)
{
perror("bind");
return 1;
}

if(listen(server_socket,5)) {
perror("listen");
return 1;
}

client_socket = accept(server_socket, (struct sockaddr*)&client_name,
(socklen_t*)&len);

Web接收到的信息是去掉TCP的头部,但是还有HTTP的头部。Web则是根据该头部的信息进行逻辑控制。一个Web服务器支持多个客户端,不同的套接字可以使用相同的端口号。

需要自己去解析HTTP的头部,来判断接下来服务器的动作。

根据HTTP头部的格式,我们一行行的读取信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 读取套接字的一行,把回车换行等情况都统一为换行符结束。
// 把读取到的信息存储到buf指针中
int get_line(int sock, char *buf, int size) {
int i = 0;
char c = '\0';
int n;
while((i < size - 1) && (c != '\n')) {
n = recv(sock, &c, 1, 0);
if(n > 0) {
if(c == '\r') {
//MSG_PEEK时代表只是查看数据,而不取走数据
n = recv(sock, &c, 1, MSG_PEEK);
if((n > 0) && (c=='\n'))
recv(sock,&c,1,0);
else
c = '\n';
}
buf[i] = c;
i++;
}
else
c = '\n';
}
buf[i] = '\0';
printf("buf : %s\n",buf);
return (i);
}

读取到信息后,需要判断请求的方法为POST还是GET,HTTP的版本,请求的文件是否存在等。

如果进行顺利,我们需要向客户端发送响应同时发送请求的信息。

通过HTTP的GET的方法,将输入的数据作为参数添加在URI后面发送给服务器。而POST则将数据放在HTTP请求消息的消息体中发送给服务器。

HTTP/1.0使用非持久连接

HTTP/1.1使用持久连接

非持久连接:Web服务器在发送一个对象资源就要使用一个TCP连接。最多只有一个对象在TCP连接上发送。下载多个对象需要多个TCP连接。

持久连接:多个对象可以在一个TCP连接上传输

比如:

当请求的默认网页中含有图片等对象,这是默认网页就不只有一个对象了。非持久连接则会发生多次的HTTP连接的过程,也就每个对象都花费一个RTT(往返时间)。持久连接一次请求完所有对象(客户端遇到一个引用对象就立即产生一个请求),所有的引用可能花费一个RTT。引用是在网页中的。

200 OK : 请求成功,请求对象包含在响应报文的后续部分
301 Moved Permanently :请求的对象已经被永久转移了;新的URL在响应报文的Location:
首部行中指定;客户端软件自动用新的URL去获取对象
400 Bad Request: 一个通用的差错代码,表示该请求不能被服务器解读
404 Not Found : 请求的文档在该服务上没有找到
505 HTTP Version Not Supported

上述的Web服务器是无法支持维护用户的状态的。比如我们平常的网络购物,购物车,历史记录等。则使用一个Cookies来维护状态。

HTTP的请求报文和响应报文中都有一个cookies的首行

用户端系统中保存有一个cookies文件,有用户浏览器管理

在Web站点有一个后端数据库

cookies的运行过程

Untitled

Web缓存

如果每个客户端都访问一个Web服务器,那么他的载荷太大,容易崩溃的。怎样不访问原始服务器,就满足客户的请求。就出现了Web缓存。

好处:

降低客户端的请求响应时间

减少一个机构内部网络与Internet接入链路上的流量

Untitled

客户端请求的对象在缓存器中不是最新的,则转向原Web服务器。原Web服务器把对象发送给客户端,同时更新缓存器中的对象。是通过HTTP头部中last-modified字段来判断的

缓存器


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!