HTTP超文本传输协议

1、 浏览器与服务器通信过程
        浏览器与 web 服务器在应用层通信使用的是 HTTP 协议(超文本传输协议),而 HTTP协议在传输层使用的是 TCP 协议。那么浏览器需要和 web 服务器三次握手建立连接后,才可以发送 HTTP 请求报文,服务器收到请求报文后,向浏览器回复 HTTP 应答报文。

        浏览器向服务器发起连接前,需要得到服务器的 IP 及端口。用户在浏览器中通常只输
入网址(网站域名) ,浏览器会通过 DNS 服务查询获取到服务器的 IP 地址。 对于端口来讲,使用 HTTP 协议的程序一般默认使用 80 端口。
        浏览器服务器建立连接后,如果两次以上的请求复用同一个 TCP 连接,则称之为长连
接。如果浏览器发送一次请求报文,服务器回复一次应答就断开连接,下次交互再重新进行
三次握手建立连接,那么就被称作短连接。使用长连接显然是更好一些,可以减少网络中的
同步报文,也使得服务器的响应速度变快。

 2.HTTP请求报头

2.1HTTP的请求报头结构

HTTP超文本传输协议_第1张图片

 HTTP请求报文段示例:

HTTP超文本传输协议_第2张图片

2.2HTTP的请求方法

请求方法       含义:

 GET :申请获取资源,而不对服务器产生任何影响

HEAD:和GET方法类似,不过仅要求服务器返回头部信息,而不需要传输任何实际内容

POST:客服端向服务器提交数据的方法。这种方法会影响服务器:服务器可能根据收到的数据动态创建新的资源,也可能更新原有的资源。

PUT:上传某个资源

DELETE:删除某个资源

TRACE:要求目标服务器返回原始HTTP请求的内容。它用来查看中间服务器(比如代理服务器)对HTTP请求的影响。

OPTIONS:查看服务器对某个特定URL都支持哪些请求方法。也可以把URL设置为*,从而获取服务器支持的所有请求方法。

CONNECT:用于某些代理服务器,它们能把请求的连接转化为一个安全隧道

PATCH:对某个资源做部分修改

3.HTTP的应答报头

3.1HTTP的应答报头结构

HTTP超文本传输协议_第3张图片

3.2HTTP的应答状态

 HTTP超文本传输协议_第4张图片

 HTTP超文本传输协议_第5张图片

HTTP与HTTPS的区别

1.http协议:明文传输,端口号:80

2.https协议:会对数据进行加密,校验。要申请ca证书,端口号:443

应用层http和https协议在传输层都是调tcp协议

HTTP超文本传输协议_第6张图片 

 4.Web服务器的C语言实现

# include 
# include 
# include 
# include 
# include 
# include 
# include 
# include 
# define PATH "/home/stu/c2202/day21"
int socket_init();
int main ()
{
    int sockfd=socket_init();
    if (sockfd==-1)
    {
        printf ("sockfd err\n");
        exit(1);
    }
    while(1)
    {
        struct sockaddr_in caddr;
        int len=sizeof (caddr);
        int c=accept(sockfd,(struct sockaddr*)&caddr,&len);//接收
        if (c<0)//接收失败
        {
            continue;
        }
        char buff[1024]={0};
        int n=recv(c,buff,1023,0);
        if (n<=0)
        {
            close(c);
            continue;
        }
        printf ("%s\n",buff);
        send(c,"c2202 财大",10,0);
        close(c);
}
}
int socket_init()//监听套接字初始化
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if (sockfd==-1)
    {
        return -1;
    }
    struct sockaddr_in saddr;//套接字结构的地址
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(80);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof (saddr) );//命名
    if(res==-1)
    {
        return -1;
    }
    res=listen(sockfd,5);//监听队列
    if (res==-1)
    {
        return -1;
    }
    return sockfd;
}

你可能感兴趣的:(Linux学习笔记,http,网络,服务器)