精华内容
下载资源
问答
  • 应用层协议——原理

    千次阅读 2018-08-30 11:44:34
     应用层协议的实现,只需要写出能够运行不同的端系统(服务器、手机、电脑等)和通过网络彼此通信的程序。因为网络核心设备(路由器、交换机等,包括端系统设备)并不在应用层上起作用,只网络层及下面层次起...

    应用层协议——原理

      应用层协议的实现,只需要写出能够运行在不同的端系统(服务器、手机、电脑等)和通过网络彼此通信的程序。因为网络核心设备(路由器、交换机等,不包括端系统设备)并不在应用层上起作用,只在网络层及下面层次起作用,所以不需要为网络核心设备写对应的应用程序,即开发应用程序的时候只需要考虑适配端系统,不需要考虑网络核心设备。

    网络应用程序体系结构

      目前主流的网络应用程序体系结构有两种:客户-服务器体系结构(client-server architecture)对等体系结构(P2P)

    • 客户-服务器体系结构(client-server architecture):客户-服务器体系结构中,至少有一个打开的主机,被称为服务器,它服务来自其他许多称为客户的主机的请求。web应用程序就是一个典型的例子,他总是有至少一个web服务器在运行来响应浏览器的请求。客户-服务器体系结构的一个特征就是服务器具有固定且被知晓的IP地址。
    • 对等体系结构(P2P):P2P体系结构对位于数据中心的专用服务器有最小的(或者没有)依赖。应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。这些对等方并不为服务提供商所有,为用户控制的台式机、笔记本等所有。因为这种对等方通信不必通过专门的服务器,该体系被称为对等方到对等方

    进程通信

    进程的定义

      在操作系统中,进行通信的实际上是进程(process)而不是程序。一个进程可以被认为是运行在端系统中的一个程序。
      两个不同端系统上的进程,通过跨越计算机网络交换报文而相互通信。发送进程生成并向网络中发送报文;接收进程接收这些报文并可能通过报文发送回去进行响应。
      每对通信进程,我们通常将这两个进程之一标识为客户(client),另一个进程标识为服务器(server)。P2P文件共享的某些应用中,一个进程能够既是客户又是服务器。所以我们可以这样定义客户和服务器进程:在给定的一对进程之间的通信回话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在会话开始时等待联系的进程是服务器

    进程与计算机网络直接的接口

      进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文。套接字是同一台主机内应用层与运输层之间的接口,在发送端的应用程序将报文推进套接字,在该套接字的另一侧,运输层协议负责是该报文进入接收进程的套接字。由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口(Application Programming Interface, API)。应用程序开发者可以控制套接字在应用层的一切,但对改套接字的运输层端几乎没有控制权。开发者对运输层的控制仅限于:①选择运输层协议;②也许能设定几个运输层参数,如最大缓存和最大报文段长度等。一旦开发者选择了一个运输层协议,则应用程序就建立在由该协议提供的运输层服务上。

    进程寻址

      在一台主机上运行的进程为了向在另一台主机上运行的进程发送分组,接收进程需要有一个地址。为了标识改接收进程,需要定义两种信息:①主机的地址;②定义在目的主机中的接收进程的标识符。
      在因特网中,主机由其IP地址(IP address)标识。IP地址是一个32比特的量且能够唯一地标识主机。因为一台主机能够运行多个网络应用,发送报文时,发送进程除了要知道目的地的主机地址外,还需要指定运行在接收主机上的接收进程(接收套接字)。目前比较流行的端口有:Web服务器的80端口、SMTP的25端口等。

    运输服务

    可供应用程序使用的运输服务

      网络中运输层的协议不止一种,开发应用时需要根据需求选择相对应的运输层协议。根据对运输层服务的要求,可以将运输层服务大体分为四类:可靠数据传输吞吐量定时安全性

    可靠数据传输

      有时候数据丢失可能会造成灾难性的后果,所以必须做一些工作以确保由应用程序的一端发送的数据正确、完全地交付给该应用程序的另一端。如果一个协议提供了这样的确保数据交付服务,就认为提供了可靠数据传输(reliable data transfer)。当运输协议提供这种服务时,发送进程只要将其数据传递进套接字,就可以完全相信该数据将能无差错地到达接收进程。
      此外,某些进程不能提供可靠数据传输,由发送进程发送的某些数据可能不能够到达接收进程。这种运输层协议一般用于多媒体应用,如音频、视频等。这些应用能够承受一定量的数据丢失,却并不致命。

    吞吐量

      在沿着一条网络路径上的两个进程之间的通信会话场景中,可用吞吐量就是发送进程能够向接收进程交付的比特速率。因为其他会话将共享沿着该网络路径的带宽,并且因为这些会话将会到达和离开,该可用吞吐量将随时间波动。这就要求运输层协议能够以某种特定的速率提供确保的可用吞吐量,及吞吐量服务。使用这种服务,该应用程序能够请求r比特/秒的确保吞吐量,并且该运输协议能够确保可用吞吐量总是至少为r比特/秒。

    定时

      运输层协议能提供定时保证,如发送方注入进套接字中的每个比特到达接收方的套接字不迟于100ms。这种服务队交互式实时应用程序具有很大的吸引力,如网络电话、网络交互游戏等,这些应用为了有效性而要求数据交付有严格的时间限制。

    安全性

      运输协议能够为应用程序提供一种或多种安全性服务。例如,在发送主机中,运输协议能够加密由发送进程传输的所有数据,在接收主机中,运输层协议能够在数据交付给接收进程之前解密这些数据。运输协议还能提供机密性以外的其他安全性服务,包括数据完整性和端点鉴别。

    因特网提供的运输服务

      因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议,即UDPTCP。当为因特网创建一个新的应用时,受限要做出的决定是选择UDP还是TCP。每个协议为调用它们的应用程序提供了不同的服务集合。下表为一些应用程序的服务要求。

    应用 数据丢失 带宽 时间敏感
    文件传输 不能丢失 弹性
    电子邮件 不能丢失 弹性
    Web文档 不能丢失 单行(几kbps)
    因特网电话/视频会议 容忍丢失 音频(几kbps~1Mbps)、视频(10kbps~5Mbps) 是,100ms
    存储音频/视频 容忍丢失 同上 是,几秒
    交互式游戏 容忍丢视 几kbps~10kbps 是,100ms
    即时讯息 不能丢失 弹性 是和不是

    TCP服务

      TCP服务模型包括面向连接服务和可靠数据传输服务。当某个应用程序调用TCP作为运输协议时,该应用程序就能获得来自TCP的两种服务。

    • 面向连接的服务:在应用层数据报文开始流动之前,TCP让客户和服务器互相交换运输层控制信息。这个所谓的握手过程提示客户和服务器,使它们为大量分组的到来做好准备。在握手阶段后,一个TCP连接就在两个进程的套接字之间建立了。这条连接是全双工的,即连接双方的进程可以在此连接上同时进行报文的收发。当应用程序结束报文发送时,必须拆除该连接。
    • 可靠的数据传送服务:通信进程能够依靠TCP,无差错、按适当顺序交付所有发送的数据。当应用程序的一端将字节流传进套接字时,它能够依靠TCP将相同的字节流交付给接收方的套接字,而没有字节的丢失和冗余。

        TCP协议还具有拥塞控制机制,这种服务不一定能为通信进程带来直接好处,但能为因特网带来整体好处。当发送方和接收方之间的网络出现拥塞时,TCP的拥塞控制机制会抑制发送进程(客户或服务器)。

    UDP服务

      UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。UDP是无连接的,因此在两个进程通信前没有握手过程。UDP协议提供一种不可靠数据传送服务,也就是说,当进程将一个报文发送进UDP套接字时,UDP协议并不保证该报文将到达接收进程。不仅如此,达到接收进程的报文也可能是乱序到达的。
      UDP没有包括拥塞控制机制,所以UDP的发送端可以用它选定的任何速率向其下层(网络层)注入数据。

      下表指出了一些流行的因特网应用所使用的运输协议:

    应用 应用层协议 支撑的运输协议
    电子邮件 SMTP [RFC 5321] TCP
    远程终端访问 Telnet [RFC 854] TCP
    Web HTTP [RFC 2616] TCP
    文件传输 FTP [RFC 959] TCP
    流式多媒体 HTTP (如 YouTube) TCP
    因特网电话 SIP [RFC 3261]、RTP [RFC 3550]或专用的(如 Skype) UDP 或 TCP

    因特网运输协议所不提供的服务

      运输层协议服务有可靠数据传输吞吐量定时安全性4个方面的服务。TCP提供了可靠的端到端数据传送,并且TCP在应用层可以很容易地用SSL来加强已提供安全服务。但是,TCP却没有提供吞吐量服务和定时服务,或者说因特网运输协议没有提供这两种服务。

    应用层协议定义

      应用层协议(application-layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。主要有以下的定义:

    • 交换的报文类型,例如请求报文和响应报文
    • 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的
    • 字段的语义,即这些字段中包含的信息的含义
    • 一个进程何时以及如何发送报文,对报文进行响应的规则
    展开全文
  • 参考:https://zhidao.baidu.com/question/337954440.html 基于TCP的有FTP、Telnet、SMTP、HTTP、POP3与DNS 基于UDP的有TFTP、SNMP与DNS 其中DNS既可以基于TCP,也可以基于UDP。

    参考:https://zhidao.baidu.com/question/337954440.html
    基于TCP的有FTP、Telnet、SMTP、HTTP、POP3与DNS
    基于UDP的有TFTP、SNMP与DNS
    其中DNS既可以基于TCP,也可以基于UDP。

    展开全文
  • HTTP协议(应用层协议

    千次阅读 2018-08-09 15:48:10
     应用层协议,一方面包含客户端和服务器端需要进行交互的信息,一方面包含如何组织(序列化)以及如何解析信息(反序列化)。 2 自定制协议  我们可以通过一个简单的网络计算器的例子来自定制一个协议,体会其中...

    1 协议

          我们都知道,协议是一种约定,我们规定好一种信息的格式,如果发送方按照这种请求格式发送信息,那么接收端就要按照这样的格式解析数据。这就是协议。

          应用层协议,一方面包含客户端和服务器端需要进行交互的信息,一方面包含如何组织(序列化)以及如何解析信息(反序列化)。

    2 自定制协议

          我们可以通过一个简单的网络计算器的例子来自定制一个协议,体会其中的含义。

    自定制协议一:

          首先,客户端规定发送的请求是一串字符串,形如“1+1”;

          其次,这串字符串由两个数字,中间一个加号构成,并且他们之间没有空格;

          最后,服务器在解析这串字符时,就可以按照它规定的方式解析解析出两个加数。这样,我们规定的字符串的格式就是一种协议。

    自定制协议二:

          除了上面定义一个字符固定格式的字符串的方法,我们还可以选择定义一个结构体,这个结构提包含我们要传递的信息,比如定义一个结构体,保存着两个加数,在定义一个结构体,保证着两个加数相加之后的结果;

          在客户端将该结构体转化为字符串,再将该字符串(序列化)发送给服务器,服务器将该字符串再转化为结构体(反序列化),通过计算,将结果写入另一个结构体中,转化为字符串,在发送回客户端。

    #include <stdio.h>                                                                                                                   
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include "proto.h"
    /*
     * 这是一个服务器实现了简单的计算功能(加法)
     * 这里使用一个结构体来保存数据,解析数据时就按照结构体的定义来解析数据
     */
    
    int main(int argc, char* argv[])
    {
        if(argc != 3)
        {   
            printf("usage: ./server [IP] [port]\n");
            return 0;
        }
        //创建socket                                                                                                                     
        int sock = socket(AF_INET, SOCK_DGRAM, 0);
        if(sock < 0)
        {
            perror("socket");
            return 1;
        }
        //绑定IP和port
        struct sockaddr_in server;
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = inet_addr(argv[1]);
        server.sin_port = htons(atoi(argv[2]));
        int ret = bind(sock, (struct sockaddr*)&server, sizeof(server));
        if(ret < 0)
        {
            perror("bind");                                                                                                              
            return 2;
        }
        //进入循环,处理数据
        while(1)
        {
            Request req;
            //将数据读到req中(req是一个结构体,不需要进行强转)
            struct sockaddr_in client;
            socklen_t len;
            recvfrom(sock, &req, sizeof(req), 0, (struct sockaddr*)&client, &len);
            //进行计算
            ntohl(req.a);
            ntohl(req.b);
            Response res;
            res.sum = req.a + req.b;                                                                                                     
            htonl(res.sum);
            //将结果写回到客户端
            sendto(sock, &res, sizeof(res), 0, (struct sockaddr*)&client, len);
        }
    }
    
    #pragma once                                                                                                                         
    
    typedef struct Request
    {
        int a;
        int b;
    }Request;
    
    typedef struct Response
    {
        int sum;
    }Response;
    

    上面是采用结构体实现的应用层协议,无论是方案一实现的协议,还是方案二实现的,只要能够正确的按照协议解析和传递数据,就是应用层协议。

    3 HTTP协议

          HTTP协议是大佬定制的非常好用的应用层协议,我们可以直接使用该协议,而不是自己花时间精力定制一个不好用的协议,省去了许多事情。下面我们就来认识以下HTTP协议:

    3.1 认识URL

          URL(统一资源定位符):平时我们说的网址,就是URL

    URL的格式:

    • 协议方案名:使用http:或https:等协议方案名获取访问资源时要指定协议类型

    • 登录信息:用户名和密码作为从服务器端获取的必要登录信息,是可选项

    • 服务器地址:带访问服务器的地址(可以是方面的带解析的地址,也可以是IPv4地址)

    • 服务器端口号:指定服务器连接的网络端口号,同样是可选项(用户省略,则使用默认端口号)

    • 带层次的文件路径:指定服务器上的文件路径来定位特指的资源

    • 查询字符串:针对已指定文件路径内的资源,可以使用查询字符串传入任意参数

    • 片段标识符:通常可标记出以获取资源中的子资源

    urlencode和urldecode:

          在url中,像/,?等都不能随意出现,因为它们都已经具有了特殊的含义。于是当我们需要这些字符可以原模原样的出现时,就需要进行转义,比如说C++中的‘+’:

    urldecode就是urlencode的逆过程。

    3.2 HTTP协议格式

    3.2.1 HTTP请求

    • 首行:由方法+url+http版本构成
    • header:请求的属性,由冒号分隔的键值对构成
    • 空行:分隔了header和body部分
    • body:空行后面的内容都是body,允许body为空;当body存在时,header中要有一个Content-Length属性来标识body长度

    3.2.2 HTTP响应

    • 首行:由版本号+状态码+状态码解释构成
    • header:响应的属性,有一个个以冒号为分隔的键值对组成
    • 空行:分隔header和body
    • body:body允许为空;当body存在,header中要有一个Content-Length属性来标识body长度

    3.2.3 方法

    以上是HTTP协议常见的方法。

    3.2.4 状态码

    3.2.5 header

    HTTP协议常见header:

    • Content-Type:body部分的数据类型
    • Content-Length:body部分的长度
    • Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上‘
    • User-Agent:声明用户的操作系统和浏览器的版本信息
    • referer:当前页面是从哪个页面跳转过来的
    • location:搭配3xx状态码使用,告诉客户端接下来要去哪里访问
    • Cookie:用于在客户端存储少量信息,通常用于实现会话(session)的功能

    3.3 实现一个简单的HTTP服务器

    #include <stdio.h>
    #include <string.h>
    #include <sys/un.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <pthread.h>
    #include <unistd.h>
    
    void* Entry(void* arg)
    {
        int new_sock = (int)arg;
        char buf[1024*10] = {0};                                                                                                         
        //读取请求并响应(响应忽略)
        ssize_t s = read(new_sock, buf, sizeof(buf) - 1); 
        if(s > 0)
        {
            buf[s] = '\0';                                                                                                               
            printf("response:%s\n", buf);
        }
        const char* first_line = "HTTP/1.1 200 OK\n";
        const char* blank_line = "\n";
        const char* body = "<html>hello world!</html>";
        const char header[1024] = {0};
        //格式化构造字符串
        sprintf(header, "Content_Type: text/html;\nContent_Length: %lu\n", strlen(body));
        //注意写的顺序
        write(new_sock, first_line, strlen(first_line));
        write(new_sock, header, strlen(header));
        write(new_sock, blank_line, strlen(blank_line));
        write(new_sock, body, strlen(body));
        return NULL;
    }                                                                                                                                    
    int main(int argc, char* argv[])
    {
        if(argc != 3)
        {
            printf("usage: ./server [ip] [port]\n");
            return 1;
        }
        //创建socket
        int sock = socket(AF_INET, SOCK_STREAM, 0);
        if(sock < 0)
        {
            perror("socket");
            return 2;
        }
        //进行绑定                                                                                                                       
        struct sockaddr_in server;
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = inet_addr(argv[1]);
        server.sin_port = htons(atoi(argv[2]));
        int ret = bind(sock, (struct sockaddr*)&server, sizeof(server));
        if(ret < 0)
        {
            perror("bind");
            return 2;
        }
        //listen
        if(listen(sock, 128) < 0)
        {
            perror("listen");
            return 3;                                                                                                                    
        }
        //进入循环
        while(1)
        {
            struct sockaddr_in client;
            socklen_t len;
            int new_sock = accept(sock, (struct sockaddr*)&client, &len);
            if(new_sock < 0)
            {
                close(sock);
                continue;
            }
            pthread_t td;
            pthread_create(&td, NULL, Entry, (void*)new_sock);
            pthread_detach(td);                                                                                                          
        }
    }
    

    我们使用我们的代码时,还可能出现GET /favicon.ico HTTP/1.1这样的请求,那么这是什么意思呢?

    上图中用蓝色圈出来的小图标就是通过这个请求获得的。

    另外,不同的状态码的含义不同,200代表成功发送响应,404代表找不到页面。在上面的代码中,如果我们将200改成404,那么页面就加载不出来了..

    展开全文
  • 应用层常见协议——知识点

    万次阅读 多人点赞 2018-04-18 15:10:09
    这里总结了三种常见的应用层协议:HTTP、FTP、SMTP。供自己复习使用,也供大家参考!一、HTTP协议1、HTTP简介—超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web...

    这里总结了三种常见的应用层协议:HTTP、FTP、SMTP。供自己复习使用,也供大家参考!

    一、HTTP协议

    1、HTTP简介

    —超文本传输协议(Hypertext transfer protocol)。是一种详细规定浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

    —HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图:


    HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

    —HTTP默认的端口号为80,HTTPS的端口号为443;

    浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。

    2、HTTP的特点

    —简单快速:客户像服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

    —灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

    HTTP 0.9和1.0使用非持续连接限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间。

    无状态HTTP协议是无状态协议无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

    支持B/S及C/S模式。即浏览器/服务器模式和客户端/服务端模式。

    3、HTTP工作流程

    一次HTTP操作称为一个事务,其工作过程可分为四步:

    —首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

    —建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

    服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

    客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接

    如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

    4、HTTP请求消息Request

    客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

    请求行请求头部空行请求数据四个部分组成。

    (1)GET请求


    第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.

    GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。

    第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息

    从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等

    第三部分:空行,请求头部后面的空行是必须的

    即使第四部分的请求数据为空,也必须有空行。

    第四部分:请求数据也叫主体,可以添加任意的其他数据。

    这个例子的请求数据为空。


    POST请求


    第一部分:请求行,第一行明了是post请求,以及http1.1版本。
    第二部分:请求头部,第二行至第六行。
    第三部分:空行,第七行的空行。

    第四部分:请求数据,第八行。

    5、HTTP响应消息Reponse

    一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。

    HTTP响应也由四个部分组成,分别是:状态行消息报头空行响应正文



    第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

    第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

    第二部分:消息报头,用来说明客户端要使用的一些附加信息

    第二行和第三行和第四行为消息报头,
    Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1

    第三部分:空行,消息报头后面的空行是必须的
    第四部分:响应正文,服务器返回给客户端的文本信息。

    空行后面的html部分为响应正文。


    6、HTTP状态码

    状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

    1xx:指示信息--表示请求已接收,继续处理

    2xx:成功--表示请求已被成功接收、理解、接受

    3xx:重定向--要完成请求必须进行更进一步的操作

    4xx:客户端错误--请求有语法错误或请求无法实现

    5xx:服务器端错误--服务器未能实现合法的请求


    常见状态码:


    7、HTTP请求方法

    根据HTTP标准,HTTP请求可以使用多种请求方法。
    HTTP1.0定义了三种请求方法: GETPOST 和 HEAD方法。

    HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。


    8、HTTP工作原理

    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

    以下是 HTTP 请求/响应的步骤:

    1、客户端连接到Web服务器

    一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。

    2、发送HTTP请求

    通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

    3、服务器接受请求并返回HTTP响应

    Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

    4、释放连接TCP连接

    若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

    5、客户端浏览器解析HTML内容

    客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。


    二、FTP协议

            文件传输协议FTP(File Transfer Protocol)是因特网中使用最广泛的文件传输协议。FTP使用交互式的访问,允许客户指定文件的类型和格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输入有效的口令)。

            文件传输协议有基于TCP的FTP和基于UDP的简单文件传输协议TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特点是:若要存取一个文件,就必须先获得一个本地的文件副本。如果要修改文件,只能对文件的副本进行修改,然后再将修改后的文件传回到原节点。

            1、FTP基本工作原理

            FTP屏蔽了各计算机系统的细节,因而适合在异构网络中人以计算机之间传送文件。FTP只提供文件传送的一些基本服务,它使用TCP可靠的传输服务,FTP主要功能是减小或消除在不同系统下处理文件的不兼容性。

            FTP使用客户端-服务端模型,一个FTP服务器进程可以为多个客户进程提供服务。FTP服务器有两大部分组成:一个主进程,负责接受新的请求;还有若干从属进程,负责处理单个请求。主进程工作步骤:

            打开熟知端口21,使客户进程能够连接上;

            等待客户进程发送链接请求;

            启动从属进程处理客户进程发送的连接请求,从属进程处理完请求后结束,从属进程在运行期间可能根据需要可创建其他一些子进程。

            回到等待状态,继续接受其他客户进程发起的请求,主进程与从属进程的处理是并发进行的。

            图为FTP工作时的情况:


            使用两个TCP连接——

            FTP连接在整个会话期间都保持打开,只用来发送连接/传送请求,当客户进程向服务器发送连接请求时,寻找连接服务器的熟知端口21,同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。接着,服务器进程用自己传送数据的熟知端口20与客户进程所提供的端口号码建立数据传送连接,FTP使用了2两个不同的端口号,所以数据连接和控制连接不会混乱。

            1.1 FTP数据表示

            FTP协议规定了控制协议传送与存储的多种选择,在以下4个方面必须做出一个选择:

            文件类型:ASCII码文件(默认的)/图像文件类型(二进制的)/本地文件类型(用于在具有不同字节大小主机间传送二进制数据)

            格式控制:该选项针对ASCII类型文件适用,非打印(默认选择,文件中不包括垂直格式信息)/远程登录格式控制。

            结构:文件结构(默认选择,文件被认为是一个连续的字节流,不存在内部的文件结构)/记录结构(用于文本文件)

            传输方式:流方式(模式选择,文件以字节流方式传输,对于文件结构,发方在文件尾提示关闭数据连接,对于记录结构,有专用的两字节序列码记录结束和文件结束)/块方式(文件以一系列块来传送,每块前面有一个或多个首部字节)/压缩方式。

            1.2 FTP命令和应答

            命令和应答在客户和服务器的控制连接上以 NVT ASCII码形式传送。这就要求在每行结尾都要返回C R、 L F对(也就是每个命令或每个应答)。这些命令都是3或4个字节的大写ASCII字符,其中一些带选项参数。从客户向服务器发送的FTP命令超过30种。下图是比较常用的几种命令:


            应答都是ASCII码形式的3位数字,并跟有报文选项。其原因是软件系统需要根据数字代码来决定如何应答,而选项串是面向人工处理的。由于客户通常都要输出数字应答和报文串,一个可交互的用户可以通过阅读报文串(而不必记忆所有数字回答代码的含义)来确定应答的含义。



            2、FTP工作模式

            两种工作模式:主动模式和被动模式;

            主动模式:服务器主动连接客户端;

            被动模式:客户端主动连接服务器。


            3、问题

            如何知道FTP传送一个文件结束?

            解答:通用传输模式是流方式,并且文件的结尾是以关闭数据连接为标志,这意味着对每一个文件传输或目录列表来说都要建立一个全新的数据连接。一般过程如下:

            —正由于是客户发出命令要求建立数据连接,所以数据连接是在客户端的控制下建立的;

            —客户通常在客户端主机上为所在数据连接端选择一个临时端口号。客户从该端口号发布一个被动的打开;

            —客户使用PORT命令从控制连接上把端口号发向服务器;

            —服务器在控制连接上接受端口号,并向客户端主机上的端口发布一个主动的打开。服务器的数据连接段一直使用端口20.

            给出了第 3步执行时的连接状态。假设客户用于控制连接的临时端口是 11 7 3,客户用于数据连接的临时端口是1174。客户发出的命令是PORT命令,其参数是6个ASCII中的十进制数字,它们之间由逗点隔开。前面 4个数字指明客户上的 I P地址,服务器将向它发出主动打开(本例中是 140.252.13.34),而后两位指明16 bit端口地址。由于16 bit端口地址是从这两个数字中得来,所以其值在本例中就是 4×256+150=1174。

                    

      下图给出了服务器向客户所在数据连接端发布主动打开时的连接状态。服务器的端点是端口20。

                 

            服务器总是执行数据连接的主动打开。通常服务器也执行数据连接的主动关闭,除非当客户向服务器发送流形式的文件时,需要客户来关闭连接。


    三、SMTP协议

    1、介绍

            SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议。它是一组用于由源地址到目的地址传送邮件 
    的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件 
    时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程 
    只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。SMTP 

    是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。

            工作过程

            首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务器主机上的 
    SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再 

    尝试建立该连接。

    2、SMTP命令和应答


            SMTP使用一些命令和应答,在MTA客户和MTA服务器之间进行之间传输报文。如下图所示,为SMTP主要的命令和应答: 

            

    3、邮件报文的封装和报文形式

    SMTP协议可以将互联网邮件报文封装在邮件对象中。SMTP协议的邮件对象由两个部分组成:信封和内容。

    信封其实是一种SMTP命令;

    邮件报文是邮件对象中的内容,由首部和主体两个部分。


    对报文格式的定义:

    —所有报文都是由ASCII码组成;

    由报文行组成,各行之间用回车(CR)、换行(LF)符分隔

    ——报文的长度不能超过998个字符

    ——报文行的长度78个字符之内(不包括回车换行符)

    ——报文中可包括多个首部字段和首部内容

    ——报文可包括一个主体,主体必须用一个空行与其首部分隔

    ——除非需要使用回车与换行符,否则报文中不使用回车与换行符

    4、邮件报文的传送过程

    连接建立

    SMTP客户和SMTP服务器首先要建立TCP连接。 

    1. 从客户端使用熟知端口号25建立与服务器的TCP连接,SMTP服务器向该客户送回应答码220,并且还为客户端提供了服务器的域名 

    2. 客户端收到应答码后,发送HELO命令,启动客户端和服务器之间的SMTP会话。该客户端发送的HELO用来向服务器提供客户端的标识信息 

    3. 服务器端回应应答码250,通知客户端:请求建立邮件服务会话已经实现

    报文发送

    在SMTP客户与SMTP服务器之间的连接建立之后,发信的用户就可以与一个或多个收信人交换邮件报文了。

    1. 客户用“MAIL FROM”向服务器报告发信人的邮箱与域名 

    2. 服务器向客户回应应答码“250”,代表请求命令完成 

    3. 客户用“RCPT TO”命令向服务器报告收信人的邮箱与域名 

    4. 服务器向客户回应应答码“250”,代表请求命令完成 

    5. 客户用“DTAT”命令对报文的传送进行初始化 

    6. 服务器回应“354”,表示可以进行邮件输入了 

    7. 客户用连续的行向服务器传送报文的内容,每行以两字符的行结束标识(CR与LF)终止。报文以只有一个“.”的行结束 

    8. 服务器向客户回应应答码“250”,代表请求命令完成

    连接终止

    报文发送完毕后终止本次SMTP会话。

    —客户端发送QUIT命令;

    ——服务器收到命令后,回应应答码“221”,并结束会话。

    模拟上述三个步骤:


    建立连接


    传输报文


    终止连接



    展开全文
  • 应用层安全协议的五个种类

    千次阅读 2020-03-11 16:07:51
    应用层安全协议 五个种类 http PGP S/MIME RSA DES Kerberos
  • 常见应用层协议端口号

    万次阅读 2014-07-25 22:00:58
    常用服务 协议 端口  DNS UDP 53  1. POP3 TCP 110  2. IMAP TCP 143  3. SMTP TCP 25  4. Telnet TCP 23  5. 终端服务 TCP 3389  6. PPTP TCP 1723  7. 
  • TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。  网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。  传输层中有TCP协议与UDP协议。  在应用层有:TCP包括FTP、HTTP、TELNET、SMT
  • 首先介绍一个定义: 应用层协议网络版加法计算器一文中,我们介绍的实现网络版本的加法计算器有两种方法。其实无论是哪种方法,只要能够保证,一端发送时构造的数据,另一端能够正确的解析,就是ok的,这种约定...
  • @本系列文章是阅读TCP/IP协议:详解的过程中,根据稳重内容,对重要知识点做的总结,包含个人观点,插图均来自书中。 第25章:SNMP: 简单网络管理协议 第26章:Telnet和Rlogin:远程登录  第27章:文件传输...
  • 应用层协议与硬件)   OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 。 完成中继功能的节点通常...
  • 网络协议概述:物理层、连接层、网络层、传输层、应用层详解 这篇文章主要介绍了网络协议概述:物理层、连接层、网络层、传输层、应用层详解,本文用生活中的邮差与邮局来帮助理解复杂的网络协议,通俗...
  • 最近做K线图相关的东西,需要和服务器进行长连接实时获取数据,因为后台使用webSocket实现的,经过一番波折最终找到了facebook开源的 SocketRocket 框架,他是用oc封装的websocket实现,这篇是网上找到的使用...
  • 五层网络协议,各层功能,各层协议

    万次阅读 多人点赞 2018-05-11 11:21:01
    一、OSI七层模型OSI七层协议模型主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。三、五层...
  • 应用层主要包含的协议有:文件传送协议FTP、超文本传送协议HTTP FTP提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限。FTP屏蔽了各计算机系统的细节,因而适合于异构网络中任意计算机...
  • TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)是运输的两个主要协议,均是互联网的正式标准。它们的主要区别如下:  1、TCP是面向连接的,UDP是无连接的...
  • HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的...
  • OSI七层协议在网络传输中扮演的角色及功能:7、应用层——–电脑的各种数据6、表示层 ——– 处理用户信息的表示问题,如编码、数据格式转换和加密解密5、会话层——–会话管理、会话流量控制、寻址、寻址4、传输层...
  • MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)最早是IBM开发的一个即时通讯协议,MQTT协议是为大量计算能力有限且工作低带宽、可靠网络的远程传感器和控制设备通讯而设计的一种协议。...
  • 网络体系结构通常是由两种模型来表示,一个是7的OSI参考模型,一个是5的TCP/IP参考模型。 OSI七模型: TCP/IP五模型: TCP/IP模型由于其协议被广为流传,乃至后来被Internet使用,所以我们后面也主要...
  • OSI七模型中,处于不同的中继系统具有不同的名称。  一个设备工作哪一,关键看它工作时利用哪一的数据头部信息。网桥工作时,是以MAC头部来决定转发端口的,因此显然它是数据链路的设备。
  • 1、TCP、UDP不是应用层协议,是传输层协议。 2、应用层所谓的应用,就是为了一个具体的应用场景而做的协议,应用层协议之间的区别,就是应用之间的区别。HTTP和FTP有什么区别,就是HTTP用来传输超文本而FTP用来传...
  • 一:三种体系结构的比较osi七层体系结构tcp/ip四层协议结构五层协议的结构7:应用层4:应用层(各种应用层协议):5:应用层6:表示层 5:会话层 4:运输层3:运输层(tcp/ip)4:运输层3:网络层:2:网际层ip3:网络层...
  • 传输层协议

    千次阅读 2018-10-20 21:53:56
    1 传输层协议 网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是两个传输层实体之间...
  • HTTP是应用层协议,TCP(传输控制协议)UDP(用户数据协议)他们是传输层协议,IP(网络协议),至于数据链路(就是我们说的以太网,FDDI,令牌环网等)socket是操作系统用来实现网络传输层以下协议的方式。...
  • &nbsp; OSI 七模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能...OSI七模型中,处于不同的中继系统具有不同的名称。&nbsp;&nbsp;&nbsp; ...
  • 信号的传输总要符合一定的协议(protocol)。比如说长城上放狼烟,是因为人们已经预先设定好狼烟这个物理信号代表了“敌人入侵”这一抽象信号。这样一个“狼烟=敌人入侵”就是一个简单的协议协议可以更复杂,比如...
  • 目录实验名称实验介绍实验目的背景知识和准备HTTP协议HTTP概述HTTP连接HTTP请求报文HTTP响应报文TCP协议TCP概述i. 端到端ii. 可靠、有序的字节流iii. 流水线iv. 发送和...应用层和传输层网络协议分析 实验介绍 实验使

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 254,288
精华内容 101,715
关键字:

以下哪个不在应用层的协议是