精华内容
下载资源
问答
  • C51 Web Server 基于uIP协议栈 使用keil环境,直接可以使用。
  • 基于协议行为的新型Web隧道检测方法
  • 前两天我采用技巧式方案基本实现大文件分片上传,这里只是重点在于个人思路和亲身实践,若在实际生产环境要求比较高的话肯定不行,仍存在一些问题需要深入处理,本文继续在之前基础上给出基于tus协议的轮子方案,本...
  • 基于HTTP协议WEB服务器,简易版的Tomcat.服务端读取配置文件完成对服务 器的初始化,并通过Socket网络编程架构服务器端.浏览器作为客户端,向服务器发送请求.服务端接受请求并将其封装为一个HTTPRequest对象,并对其...
  • 基于uip协议WEB服务器的软件设计
  • 基于http协议Web服务器

    千次阅读 2018-10-01 11:47:41
    原理:由HTTP客户端发起一个请求,建立一个到服务器指定端口... HTTP协议: 超文本传输协议,是互联网上使用的最广泛的协议,HTTP是一个客户端和服务器端请求和应答的标准(TCP)。 HTTP请求: HTTP请求由...

    原理:由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认端口:80)的TCP连接。HTTP在此端口监听客户端发送过来的请求。一旦收到请求,服务器向客户端回复一个状态行,比如:“HTTP/1.0 200 OK”,和响应消息。

    HTTP协议:

    超文本传输协议,是互联网上使用的最广泛的协议,HTTP是一个客户端和服务器端请求和应答的标准(TCP)。

    HTTP请求:

    HTTP请求由以下部分组成

    • 请求行:请求方法,请求URL,协议版本
    • 请求头:包含若干属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
    • 空行:
    • 请求体:传递请求参数

     

     HTTP响应:

    HTTP响应由以下部分组成

    • 状态行:协议版本,状态码,状态码描述
    • 响应头部:头部字段名,字段值
    • 空行:
    • 响应正文:响应的参数

     基本思想:

      了解TCP协议:https://blog.csdn.net/yh971660526/article/details/82930041

    1. HTTP协议是基于TCP的通信协议(连接可靠性),实现两台主机不同进程之间的通信(客户端和服务器)。通过socket建立通信。
    2. 服务器接收客户端请求后,分析请求方法(GET(从指定的资源请求数据,参数在URL中)、POST(向指定的资源提交    要被处理的数据,参数在请求正文中)等)。
    3. 拿到请求的URL
    4. 判断资源是否存在,以网页的形式返回给客户端或返回错误。

    http_server.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <fcntl.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/stat.h>
    #include <sys/sendfile.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <pthread.h>
    
    #define MAX 1024
    #define MAIN_PAGE "index.html"
    #define PAGE_404 "wwwziyuan/404.html"
    
    static void usage(const char *proc)
    {
    	printf("Usage:%s prot\n",proc);
    }
    //监听套接字
    int startup(int port)
    {
    	//创建socket
    	int sock=socket(AF_INET,SOCK_STREAM,0);
    	if(sock<0)
    	{
    		perror("socket");
    		exit(2);
    	}
    	
    	int opt=1;
    	setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
    
    	struct sockaddr_in local;
    	local.sin_family=AF_INET;
    	local.sin_addr.s_addr=htonl(INADDR_ANY);
    	local.sin_port=htons(port);
    
    	//绑定
    	if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)
    	{
    		perror("bind");
    		exit(3);
    	}
    	//监听
    	if(listen(sock,5)<0)
    	{
    		perror("listen");
    		exit(4);
    	}
    
    	return sock;
    }
    //对文本按行获取
    int getLine(int sock,char line[],int len)
    {
    	char c='a';
    	int i=0;
    	while(c!='\n'&&i<len-1)
    	{
    		ssize_t s=recv(sock,&c,1,0);
    		if(s>0){
    			if(c=='\r'){
    				recv(sock,&c,1,MSG_PEEK);
    				if(c=='\n'){
    					recv(sock,&c,1,0);
    				}
    				else{
    					c='\n';
    				}
    			}
    			line[i++]=c;
    		}
    		else
    		{
    			break;
    		}
    	}
    	line[i]='\0';
    	return i;
    }
    
    //错误响应
    void echo_404(int sock)
    {
    	char line[MAX];
    	struct stat st;			   
    	stat(PAGE_404,&st);
    
    	sprintf(line,"HTTP/1.0 404 Not Found\r\n");
    	send(sock,line,strlen(line),0);
    	sprintf(line, "Content-Type:text/html;application/x-csi;application/x-jpg\r\n");
    	send(sock,line,strlen(line),0);
    	sprintf(line, "Content-Length:%d\r\n",st.st_size);
    	send(sock,line,strlen(line),0);
    	sprintf(line,"\r\n");
    	send(sock,line,strlen(line),0);
    
    	int fd=open(PAGE_404,O_RDONLY);
    	sendfile(sock, fd, NULL,st.st_size);
    	close(fd);
    }
    
    
    //响应回报文
    void echoError(int sock,int status_code)
    {
    	switch(status_code) 
    	{
    		case 404:
    			echo_404(sock);
    			break;
    		case 503: 
    			break; 
    		default: 
    			break; 
    	}
    }
    
    void clearHeader(int sock)
    {
    	char line[MAX];
    	do{
    		getLine(sock,line,sizeof(line));
    	}while(strcmp(line,"\n"));
    }
    
    //GET,PATH EXIST,NO CGI QUERY_STRING IS NULL
    int echo_resource(int sock,char *path,int size)
    {
    	char line[MAX];
    	clearHeader(sock);
    	int fd = open(path,O_RDONLY);
    	if(fd<0)
    	{
    		return 500;
    	}
    	
    	//区分后缀
    	sprintf(line,"HTTP/1.0 200 OK\r\n");
    	send(sock,line,strlen(line),0);
    	char *p=path+strlen(path)-1;
    	while(*p!='.'){
    		p--;
    	}
    	if(strcmp(p,".css")==0)
    	{
    		sprintf(line,"Content-Type:text/css\r\n");
    	}
    	else if(strcmp(p,".js")==0)
    	{
    		sprintf(line,"Content-Type:application/x-javascript\r\n");
    	}
    	else
    	{
    		sprintf(line,"Content-Type:text/html;application/x-csi;application/x-jpg\r\n");
    	}
    	send(sock,line,strlen(line),0);
    
    	sprintf(line,"Content-Length:%d\r\n",size);
    	send(sock,line,strlen(line),0);
    	sprintf(line,"\r\n");
    	send(sock,line,strlen(line),0);
    
    	sendfile(sock,fd,NULL,size);
    
    	close(fd);
    	return 200;
    }
    
    int exe_cgi(int sock,char *method,char *path,char *query_string)
    {
    	char line[MAX];
    	int content_length=-1;
    
    	char method_env[MAX/16];
    	char query_string_env[MAX];
    	char content_length_env[MAX];
    
    	if(strcasecmp(method,"GET")==0)
    	{
    		clearHeader(sock);
    	}else{
    		do{
    			getLine(sock,line,sizeof(line));
    			if(strncmp(line,"Content-Length:",16)==0)
    			{
    				content_length=atoi(line+16);
    			}
    		}while(strcmp(line,"\n"));
    		if(content_length==-1)
    		{
    			return 400;
    		}
    	}
    	//创建管道,实现进程间通信
    	int input[2];
    	int output[2];
    
    	pipe(input);
    	pipe(output);
    
    	pid_t id=fork();
    	if(id<0)
    	{
    		return 500;
    	}else if(id==0){
    		//子进程
    		close(input[1]);
    		close(output[0]);
    		
    		dup2(input[0],0);
    		dup2(output[1],1);
    
    		sprintf(method_env, "METHOD=%s", method);
    		putenv(method_env);
    		//GET:传递query_string     POST:传递content_len
    		if(strcasecmp(method, "GET") == 0)
    		{
    			sprintf(query_string_env, "QUERY_STRING=%s",query_string);
    			putenv(query_string_env);
    		}
    		else
    		{
    			sprintf(content_length_env, "CONTENT_LENGTH=%d",content_length);
    			putenv(content_length_env);}
    
    		execl(path,path,NULL);
    		exit(1);
    	}else{
    		//父进程
    		close(input[0]);
    		close(output[1]);
    		
    		int i=0;
    		char c;
    		if(strcasecmp(method,"POST")==0)
    		{
    			for(;i<content_length;i++)
    			{
    				recv(sock,&c,1,0);
    				write(input[1],&c,1);
    			}
    		}
    
    		sprintf(line,"HTTP/1.0 200 OK\r\n");
    		send(sock,line,strlen(line),0);
    		sprintf(line,"Content-Type:text/html\r\n");
    		send(sock,line,strlen(line),0);
    		sprintf(line,"\r\n");
    		send(sock,line,strlen(line),0);
    
    		while(read(output[0],&c,1)>0)
    		{
    			send(sock,&c,1,0);
    		}
    
    		waitpid(id,NULL,0);
    
    		close(input[1]);
    		close(output[0]);
    
    	}
    	return 200;
    }
    
    //处理链接请求
    void *handlerRequest(void *arg)
    {
    	printf("get a new client\n");
    	int sock=(int)arg;
    	//缓冲区
    	char line[MAX];
    	char method[MAX/16];
    	char url[MAX];
    	char path[MAX];
    	int i=0;
    	int j=0;
    	int status_code=200;
    	int cgi=0;
    	char *query_string = NULL;
    
    	//按行获取
    	getLine(sock,line,MAX);
    	
    	while(i<sizeof(method)-1 && j<sizeof(line) && !isspace(line[j]))
    	{
    		method[i]=line[j];
    		i++,j++;
    	}
    	method[i] = '\0';
    	//GET POST  strcasecmp忽略大小写
    	if(strcasecmp(method,"GET")==0)
    	{
    
    	}else if(strcasecmp(method,"POST")==0){
    		cgi=1;
    	}else{
    		//清理报头
    		clearHeader(sock);
    		status_code=400;
    		goto end;
    	}
    
    	//method url http_verdion
    	i=0;
    	while(j<sizeof(line) && isspace(line[j]))
    	{
    		j++;
    	}
    	while(i<sizeof(url)-1 && j<sizeof(line) && !isspace(line[j]))
    	{
    		url[i]=line[j];
    		i++,j++;
    	}
    	url[i]='\0';
    
    	printf("method: %s,url: %s\n",method,url);
    	
    	if(strcasecmp(method,"GET")==0)
    	{
    		query_string=url;
    		while(*query_string)
    		{
    			if(*query_string=='?')
    			{
    				*query_string='\0';
    				query_string++;
    				cgi=1;
    				break;
    			}
    			query_string++;
    		}
    	}
    	//method,url[path,query_string(GET)]
    	
    	sprintf(path,"wwwziyuan%s",url);
    
    	if(path[strlen(path)-1]=='/')
    	{
    		strcat(path,MAIN_PAGE);
    	}
    
    	printf("method: %s,url: %s,query_string:%s\n",method,path,query_string);
    
    	struct stat st;
    	if(stat(path,&st)<0)
    	{
    		clearHeader(sock);
    		status_code=404;
    		goto end;
    	}else{
    		if(S_ISDIR(st.st_mode))
    		{
    			strcat(path,"/");
    			strcat(path,MAIN_PAGE);
    		}else if((st.st_mode & S_IXUSR)||\
    				(st.st_mode & S_IXGRP)||\
    				(st.st_mode & S_IXOTH)){
    			cgi=1;
    		}else{
    			//do nothing
    		}
    
    		//method(GET,POST),path(EXIST),cgi(0|1),query_string(GET)
    		if(cgi)
    		{
    			status_code=exe_cgi(sock,method,path,query_string);
    		}
    		else
    		{
    			status_code=echo_resource(sock,path,st.st_size);
    		}
    	}
    	
    
    end:
    	if(status_code!=200)
    	{
    		echoError(sock,status_code);
    	}
    
    	close(sock);
    }
    
    // ./httpd  8080
    int main(int argc,char *argv[])
    {
    
    	if(argc!=2)
    	{
    		usage(argv[0]);
    		return 1;
    	}
    	int listen_sock=startup(atoi(argv[1]));
    
    	for( ; ;)
    	{
    		struct sockaddr_in client;
    		socklen_t len=sizeof(client);
    		int sock=accept(listen_sock,(struct sockaddr*)&client,&len);
    		if(sock<0)
    		{
    			perror("accept");
    			continue;
    		}
    
    		//创建线程
    		pthread_t tid;
    		pthread_create(&tid,NULL,handlerRequest,(void *)sock);
    		//分离线程,防止线程卡在这里
    		pthread_detach(tid);
    
    	}
    	return 0;
    }
    

    Makefile

    cc=gcc
    src=http_server.c
    bin=httpd
    
    $(bin):$(src)
        $(cc) -o $@ $^ -lpthread
    .PHONY:clean
    clean:
           rm -f $(bin)
    

     

    展开全文
  • 通过对Web Services安全性分析和SOAP消息传输过程的研究,从SOAP消息的安全...该方案有效弥补了SOAP协议本身安全性差的缺点,也提高了以SOAP协议为基础的Web services技术的安全性,对基于Web服务的应用开发具有重要意义。
  • 是一种全新的基于UDP的web开发协议。可以用一个公式大致概括: TCP + TLS + HTTP2 = UDP + QUIC + HTTP2’s API 从公式可看出:QUIC协议虽然是基于UDP,但它不但具有TCP的可靠性、拥塞控制、流量控制等,且在...

    1、QUIC介绍

    (1)QUIC(Quick UDP Internet Connections)协议

    是一种全新的基于UDP的web开发协议。可以用一个公式大致概括:

    
     

    TCP + TLS + HTTP2 = UDP + QUIC + HTTP2’s API

    从公式可看出:QUIC协议虽然是基于UDP,但它不但具有TCP的可靠性、拥塞控制、流量控制等,且在TCP协议的基础上做了一些改进,比如避免了队首阻塞;另外,QUIC协议具有TLS的安全传输特性,实现了TLS的保密功能,同时又使用更少的RTT建立安全的会话。

     

    (2)QUIC协议的主要目的

    是为了整合TCP协议的可靠性和UDP协议的速度和效率。

    QUIC的维基百科页面的介绍:

    QUIC是快速UDP网络连接(英语:Quick UDP Internet Connections)的缩写,这是一种实验性的传输层网络传输协议,由Google公司开发,在2013年实现。QUIC使用UDP协议,它在两个端点间创建连接,且支持多路复用连接。在设计之初,QUIC希望能够提供等同于SSL/TLS层级的网络安全保护,减少数据传输及创建连接时的延迟时间,双向控制带宽,以避免网络拥塞。Google希望使用这个协议来取代TCP协议,使网页传输速度加快,计划将QUIC提交至互联网工程任务小组(IETF),让它成为下一代的正式网络规范。

     

    (3)QUIC的特性

    1)低延迟连接的建立 (Connection Establishment Latency)

    这对已建立的连接很有好处。

    众所周知,建立一个TCP连接需要进行三次握手,这意味着每次连接都会产生额外的RTT,从而给每个连接增加了显著的延迟(如下图1所示)。

    另外,如果还需要TLS协商来创建一个安全的、加密的https连接,那么就需要更多的RTT,无疑会产生更大的延迟(如下图所示)。

    首次,QUIC协议可以在1个RTT中启动一个连接并且获取完成握手所需的必要信息。

    QUIC 1 RTT

    如果连接的是一个新的服务器,这时候client是没有server的任何信息的,当然也不知道用那种密钥交换算法,没有公钥信息,就不可能实现0 RTT握手,所以,对于新的QUIC连接至少需要1 RTT才能完成握手。

    在QUIC中,服务器的配置是完全静态的,而且配置是有过期时间的,由于服务器配置是静态的,因而不是每个连接都需要重新进行签名操作,一个签名可以适用于多个连接。

    另外,QUIC采用了两级密钥机制:初始密钥和会话密钥。QUIC在握手过程中使用Diffie-Hellman 算法协商初始密钥。初始密钥协商完毕后,服务器会提供一个临时随机数,会马上再协商会话密钥,这样可以保证密钥的前向安全性,之后可以在通信的过程中就实现对密钥的更新。接收方意识到有新的密钥要更新时,会尝试用新旧两种密钥对数据进行解密,直到成功才会正式更新密钥,否则会一直保留旧密钥有效。

    具体握手过程如图(图片引用daveywu的文章)所示:

     

     

    QUIC 0 RTT

    客户端在缓存了ServerConfig的情况下,客户端根据缓存的ServerConifg获取到密钥交换算法及公钥,同时生成一个全新的密钥,直接向服务器发送full Client hello消息,开始正式握手,消息中包括客户端选择的公开数。服务器收到full Client hello,不同意回复REJ;同意连接,则根据客户端的公开数计算出初始密钥,回复SHLO消息。

    客户端和服务器根据临时公开数和初始密钥,各自基于SHA-256算法推导出会话密钥。双方更换会话密钥通信,初始密钥已无用,至此,QUIC握手过程结束。

     

    2)改进的拥塞控制 (Improved Congestion Control)
    QUIC协议当前默认使用TCP协议的Cubic拥塞控制算法。看似QUIC协议只是吧TCP的拥塞算法重新实现了一遍,其实不然。QUIC协议在TCP拥塞算法基础上做了些改进:

    1.可插拔

    • 应用程序层面就能实现不同的拥塞控制算法,不需要操作系统或内核支持。

    • 单个应用程序的不同连接也能支持配置不同的拥塞控制。

    • 不需要停机和升级就能实现拥塞控制的变更。

     

    2.单调递增的Packet Number

    • QUIC并没有使用TCP的基于字节序号及ACK来确认消息的有序到达,QUIC使用的是Packet Number,每个Packet Number严格递增,所以如果Packet N丢失了,重传Packet N的Packet Number已不是N,而是一个大于N的值。 这样就很容易解决TCP的重传歧义问题。

     

    3.更多的ACK块

    • QUIC ACK帧支持256个ACK块,相比TCP的SACK在TCP选项中实现,有长度限制,最多只支持3个ACK块

     

    4.精确计算RTT时间

    • QUIC ACK包同时携带了从收到包到回复ACK的延时,这样结合递增的包序号,能够精确的计算RTT。

     

     

    3)无队头阻塞的多路复用 (Multiplexing without head-of-line blocking)

    HTTP2的最大特性就是多路复用,而HTTP2最大的问题就是队头阻塞。

    首先了解下为什么会出现队头阻塞。比如HTTP2在一个TCP连接上同时发送3个stream,其中第2个stream丢了一个Packet,TCP为了保证数据可靠性,需要发送端重传丢失的数据包,虽然这时候第3个数据包已经到达接收端,但被阻塞了。这就是所谓的队头阻塞。

    而QUIC多路复用可以避免这个问题,因为QUIC的丢包、流控都是基于stream的,所有stream是相互独立的,一条stream上的丢包,不会影响其他stream的数据传输。

     

    4)前向纠错 (Forward Error Correction)

    QUIC使用了FEC(前向纠错码)来恢复数据,FEC采用简单异或的方式,每发送一组数据,包括若干个数据包后,并对这些数据包依次做异或运算,最后的结果作为一个FEC包再发送出去。接收方收到一组数据后,根据数据包和FEC包即可以进行校验和纠错。比如:10个包,编码后会增加2个包,接收端丢失第2和第3个包,仅靠剩下的10个包就可以解出丢失的包,不必重新发送,但这样也是有代价的,每个UDP数据包会包含比实际需要更多的有效载荷,增加了冗余和CPU编解码的消耗。

     

    5)连接迁移 (Connection Migration)
    TCP的连接是基于4元组的,而QUIC使用64为的Connection ID进行唯一识别客户端和服务器的逻辑连接,这就意味着如果一个客户端改变IP地址或端口号,TCP连接不再有效,而QUIC层的逻辑连接维持不变,仍然采用老的Connection ID。

    展开全文
  • 基于Http协议Web服务器

    千次阅读 2016-03-21 20:09:21
    本篇博客通过自己建立Http服务器并且结合MySql来实现Web通信,具体代码详见GitHub: https://github.com/YuanHei/HTTPD 在此整理其运行显示界面 1.首先启动Http服务器 2.在浏览器上输入网址(我是在本机进行...

    本篇博客通过自己建立Http服务器并且结合MySql来实现Web通信,具体代码详见GitHub:

    https://github.com/YuanHei/HTTPD



    在此整理其运行显示界面

    1.首先建立数据库


    2.首先启动Http服务器


    3.在浏览器上输入网址(我是在本机进行测试,用的IP是127.0.0.1,Http协议的TCP连接默认端口号为80)


    此时页面显示如下:


    图片自己选择,此页面实现的是两个数的加减乘除,当点击submit时跳转页面如下:


    此时跳转到cgi_bin目录下的可执行文件debug_cgi,显示加减乘除的结果。

    4.当点击上上图片的register链接时,将于MySQL建立连接(数据库必须已经建立),跳转页面如下:


    点击此页面的show链接可以显现当前数据库的表单信息,表单如下图所示:


    即执行了cgi_bin目录下的可执行文件show_student_cgi。

    5.在上上个页面可输入学生姓名、年龄、学校和爱好,点击submit完成注册,页面跳转如下:


    而后返回重新点击show链接,表单显示改变发生如下变化:


    6.此时进入MySQL查看此时数据库中数据,显示如下:



    就这样一个简单的基于Http协议的Web服务器就完成了。在这个项目中结合了Linux+cgi+mysql+http,还有些功能不全面,在后期还需完善。

    展开全文
  • 简单介绍基于WEB开发的HTTP协议  今天搜索socket时找到一篇文章 基于Java的web服务器工作原理>,却在里面看到了部分介绍HTTP协议的,虽然简单,但是读完之后,还是对HTTP有一点新的理解,所以摘录了一下(部分内容...

    简单介绍基于WEB开发的HTTP协议

            今天搜索socket时找到一篇文章 <基于Java的web服务器工作原理>,却在里面看到了部分介绍HTTP协议的,虽然简单,但是读完之后,还是对HTTP有一点新的理解,所以摘录了一下(部分内容经过笔者更改).

      HTTP(The Hypertext Transfer Protocol) 是一种让 Web 服务器与浏览器(客户端)通过 Internet 发送与接收数据的协议。它是一个请求、响应协议.客户端发出一个请求,服务器响应这个请求。HTTP 运用可靠的 TCP 连接,通常用的 TCP 80 端口。它的第一个版本是 HTTP/0.9 ,然后被 HTTP/1.0 取代。当前的版本是 HTTP/1.1 ,由RFC2616(.pdf) 定义。

      本节主要对应 HTTP 1.1 ,足够使你充分理解由 Web 服务器程序发出的消息。如果你对更加详细的知识有兴趣,可以参考 RFC2616 。

      在 HTTP 中,客户端总是通过建立一个连接,并发送一个 HTTP 请求来发起一个事务。服务器不能主动去与客户端联系,也不能给客户端发出一个回叫连接。客户端与服务器端都可以提前中断一个连接。例如,当用一个浏览器下载一个文件时,你可以通过点击“停止”键来中断文件的下载,关闭与服务器的 HTTP 连接。

      HTTP 请求

      一个 HTTP 请求包含三个部分:

      Method-URI-Protocol/Version方法-地址-版本

      Request header请求头

      Entity body请求实体

      下面是一个 HTTP 请求实例

      POST /servlet/default.jsp HTTP/1.1

      Accept: text/plain; text/html 

      Accept-Language: en-gb 

      Connection: Keep-Alive 

      Host: localhost 

      Referer: http://localhost/ch8/SendDetails.htm 

      User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) 

      Content-Length: 33 

      Content-Type: application/x-www-form-urlencoded 

      Accept-Encoding: gzip, deflate 

      LastName=Franks&FirstName=Michael

    The Method-URI-Protocol/Version 在这个请求的第一行:

    POST /servlet/default.jsp HTTP/1.1

     

            其中 POST 是请求的类型。每个客户端 HTTP 请求可以是 HTTP 规范中指定的许多请求类型中的一种。HTTP 1.1 支持七种类型的请求,它们是GET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE。其中 GET 与 POST 是 Internet 应用中经常用到的二种请求类型。

      URI 完整地指定了 Internet 资源。一个 URI 通常被解析为相对服务器的根目录。这样,它应该总是以一个 '/' 前缀开始。一个 URL 实际上是 URI 的一种类型。

      Version 指的是该 HTTP 请求所用到的 HTTP 协议版本。

      请求头包含了客户端环境与请求实体的一些有用的信息。例如它包含浏览器设定的语言、实体的长度等等。每条请求头用回车换行符(CRLF)分开。

      一个非常重要的空行分开了请求头与实体,它标志着实体内容的开始。一些 Internet 开发书籍认为这个 CRLF 空行是 HTTP 请求的第四个部分。

      在上面的 HTTP 请求中,实体只是简单以下的一行:

              LastName=Franks&FirstName=Michael

      在一个典型的 HTTP 请求中,请求实体内容会长得多。

      HTTP 响应

      与请求相似,HTTP 响应也由三部分组成:

      Protocol-Status code-Description协议状态 描述代码

      Response headers响应头

      Entity body响应实体

      以下是一个 HTTP 响应的实例:

      HTTP/1.1 200 OK

      Server: Microsoft-IIS/4.0

      Date: Mon, 3 Jan 1998 13:13:33 GMT

      Content-Type: text/html

      Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT

      Content-Length: 112

      <html>

      <head>

      <title>HTTP Response Example</title></head><body>

      Welcome to Brainy Software

      </body>

      </html>

            响应头的第一行类似请求头的第一行,告诉你所用的协议是 HTTP 1.1 ,请求成功(200=success),以及没有任何问题。

      响应头类似请求头也包含了一些有用的信息。响应的实体响应本身的 HTML 内容。头与实体之间由回车换行的空行(CRLF)分开。

    展开全文
  • 基于HTTP协议Web服务器

    千次阅读 2016-03-22 17:05:55
    这篇博文只给出运行截图,没有附上源代码。... HTTP协议是一个属于应用层的协议,主要特点可概括如下: 1)支持客户/服务器模式。 2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法
  • 9.5 基于HTTP协议的服务器响应程序
  • 基于SOAP协议WEB服务研究

    千次阅读 2011-05-12 18:10:00
    摘 要(Abstract)  Web 服务是局域网和因特网上能够支持...然后介绍了基于SOAP协议WEB服务的一个具体实现过程。最后介绍了Web服务的未来发展。 A Web Service is a software system designed to supp
  • 准备通过java web基于snmp协议的局域网远程电源管理系统,(学校机房有3层,1200台电脑以上)以下是我的想法,请各位指导提建议哈,在此感谢呀 1. 通过mib borwer收集第三方电源有关的mib库,保存到枚举,集合或...
  • muffin-Muffin -- 基于 Asyncio 协议桟的又一个 web 框架
  • 基于本体的语义Web服务通信协议的研究
  • 里面包括源码和可执行文件、我是在linux下用gcc编译的可执行文件只能运行在linux下
  • 这个简单的服务器程序将能基本实现基本的被访问的功能,能够收到浏览器或其他主机上进行的访问,并能够对请求做出基本的相应,项目是基于http协议的,因为http协议一般在我们日常的网络行为中使用的还是比较高频的。...
  • 网络上很多基于ksoap2开发包的WEB SERVICE调用,虽然ksoap2不大,...本代码可以基于http协议,拼凑SOAP协议,完成.net以及java开发的web service调用。供大家分享!内部也有一例是基于ksoap2开发包的web service调用
  • 针对Web服务安全问题中的访问控制,提出将移动agent引入Web服务的安全访问控制模型,基于SRP协议Web服务附加了一个独立的访问控制代理层,实现了基于移动agent的Web服务访问控制模型,并对控制流程进行了描述。
  • 基于HTTP协议实现的小型web服务器

    万次阅读 多人点赞 2017-04-28 07:37:28
    1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源 2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面...
  • 浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。 2、web应用背景 了解了HTTP协议和HTML文
  • Lib.Azure.WebJobs.Extensions.WebPush是一个库,为基于Web协议Web推送服务客户端提供和绑定扩展。 安装 您可以从NuGet安装 , 和 。 PM> Install-Package Lib.Net.Http.WebPush PM> Install-Package Lib....
  • 1、移植好的lwip协议栈 2、js html做一个web界面 3、C实现接收post 和get请求 4、

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,799
精华内容 6,319
关键字:

web协议基于