阿鑫来了  

tcp通信程序的编写

   通信流程:

          服务端: 创建套接字->>绑定地址信息->>开始监听->>获取新建连接->>

                       使用新建连接与客户端进行通信->>关闭套接字

          客户端: 创建套接字->>向服务端发起连接->>收发数据->>关闭套接字

  存在问题: 服务端只能与一个客户端通信一次

        本质原因: 在没有新连接到来时accept阻塞, 没数据时recv阻塞

        解决方案: 多执行流并发处理(轮询) -- 在服务端accept获取新连接之后

                         创建一个新的执行流与客户端进行通信

        多进程: 1.僵尸进程的处理  2.父子进程数据独有 -- 释放父进程描述符

        多线程: 1.线程之间共享资源 -- 文件描述符表

 

应用层和传输层的典型协议解析(重点)

应用层: 负责两个进程之间的沟通, 负责应用程度之间的沟通

        应用层协议: 如何将多个数据对象组织成一个二进制数据串进行传输

        需要考虑要素: 传输性能, 解析性能, 调试便捷性

        序列化: 组织数据 -- 将多个数据对象组织成一个二进制数据串

        反序列化: 将一个二进制数据串解析得到数据对象

        序列化方式: 结构体二进制序列化(调试不便捷), json序列化(调试便捷), 

                             protobuf(调试不便捷) 

 

知名协议 -- HTTP协议: 超文本传输协议 -- html, xml......

         前情信息: http是一个明文字符串传输协议

                         http在传输层基于tcp协议实现;

                         http是一个简单的请求 - 响应协议;

http协议格式: http数据结构, http协议实现

    首行: 请求行, 响应行(对于请求与响应简单关键描述)

    头部:  对于请求或响应或者正文的一些关键描述

               由一个个键值对组成key: val, 每个键值对以\r\n结尾

    空行: \r\n, 间隔头部与正文;\r\n\r\n -- 头部结尾

    正文: 客户端提交给服务端, 或者服务端响应给客户端的数据

 

首行 -- 请求行:  包括三要素用空间间隔   请求方法,  URL(URI),  协议版本\r\n

    请求方法:    (理解清楚三者的区别) 

            GET: 从服务区获取实体资源,  请求没有正文,  但是也可以提交数据,  

                     但是提交的数据没有在正文中,  而是在URL中

                     1.get提交数据不安全   2.url长度有限制

            HEAD: 功能与GET类似,  从服务区获取实体资源,  但是不要正文实体,  只要头部

            POST: 向服务端提交数据,  数据放在正文中

            PUT    DELETE   CONNECT   OPTIONS   TRACE    PATCH

    URL: 网址 -- 统一资源定位符 -- 用于定位网络中某个主机上的某个资源

    UPI: 统一资源标识符

             组成: 协议协议名称://用户名:密码@域名:端口/资源路径?查询字符串#片段标识符

              https://i.cnblogs.com/posts/edit

             域名: 服务器别名 -- 最终访问服务器需要经过域名解析得到服务器IP

             /资源路径: 这个路径是一个相对根目录

             查询字符串: 提交给服务器的数据,  由一个个key=val形式键值对组成,  键值对之间以&符号间隔

                         urlencode : 编码 -- 用户请求的资源路径,  或者查询字符串中存在特殊字符,  则有可能与url中的特殊字符冲突

                                            将特殊字符每个字节转换为16进制数字字符,  并前缀%           +   -->   %2b

                         urldecode : 解码 -- 遇到%则认为紧随其后的两个字符进行了编码

                                            将这两个字符转换为数字,  第一个数字左移4位加上第二个数字

     协议版本:  0.9    1.0    1.1      2

           0.9 : 最早期的版本,  只支持GET方法,  并且协议还没有当前的规范,  只支持超文本数据传输

           1.0 : 规范了http协议格式,  并且新增GET, HEAD, POSH请求方法,  支持各种多媒体资源传输,  简单的缓存控制

           1.1 : 更多是对1.0版本进行性能的优化,  支持了更多请求方法以及特性(长连接, 更加完善的缓存控制, 分块传输)

           2.0 : 重新定义http协议       1.使用二进制数据传输        2.支持主动推送资源      3.服务器进行长链接响应,  不需要按序进行

通俗来说

          0.9只支持GET方法

          1.0规范了协议格式,  支持了更多请求方法,  支持了多媒体资源池传输,  但1.0对性能没有更多改进,  因此

          1.1针对传输性能进行大量改进,  比如支持长链接,  

 

首行 -- 响应行 : 协议版本  响应状态码  状态码描述\r\n

         响应状态码 : 直观向客户端反馈处理结果

                     1xx : 一些描述信息                 100 : 继续  101 : 协议切换

                     2xx : 本次请求正确处理          200 : 请求成功

        3xx : 重定向 -- 表示本次请求的资源移动到了新的链接处,  原链接依旧可以使用             301/302

          4xx : 表示客服端错误              404

          5xx : 表示服务器错误              500 : 服务器内部错误,  无法完成请求        502 :  代理服务器没有收到正确响应      503 : 系统超载       504 : 代理请求超时

        状态码描述 : 就是针对状态的文字描述

 

 首行 :

       请求行 : 请求方法,  URL(URI),  协议版本\r\n

       响应行 : 协议版本  响应状态码  状态码描述\r\n

 

 头部 : 关于请求或者响应,  或者正文的一些描述字段

          组成 : key: val\r\nkey: val\r\n

          典型头部字段 : 

                    Connecyion : 长短连接控制;  keep-alive/close

                    Referer : 记录本次请求的连接来源

                    Content-Type : 用于表示正文的数据格式

                    Content-Length : 用于表示正文的长度 -- http解决粘包问题的关键

                    Location : 用于指定重定向的新链接地址,  与3xx搭配使用

          cookie与session : 涉及的头部字段请求头Cookic,  响应头Set-Cookie

                   http协议是一个无状态协议

                   1.  一个客户端登录之后,  服务端验证登录,  成功后,  通过Set-Cookie字段设置cookie信息(用户信息, 状态)返回给客户端

                   2. 客户端收到响应后, 将Set-Cookie字段的cookie信息保存起来,  下次请求服务器的时候从cookie文件中华读取cookie信息,通过Cookie字段发送给服务器

                            cookie是一个维护http通信状态的技术 -- 但是存在安全隐患

                            解决方案 : session

                            session是服务端针对每个客户端所建立的会话,  当客户端登录成功后,  建立会话,  在绘画中记录客户端用户信息以及状态....,  通过Set-Cookie字段

                            将session_id返回给客户端

                            session_id每次请求都会发生变化,  并且用户的隐私信息一直保存在服务器防止泄露

  cookie与session的区别

         cookie是维护http通信状态的技术,  将关键信息保存在客户端,  每次请求服务器时,  读取出来发送给客户端(存在安全隐患)

         session是解决cookie安全隐患的技术,  将关键信息保存在服务器,  将session发送给客户端,  作为cookie保存起来,  往后请求输session_id即可,  解决了cookie泄密的风险

 

 正文 : 

http是一个应用层协议, 只是应用程序如何沟通的一种数据格式约定,  在传输层是基于tcp实现的

http客户端实际上就是一个tcp客户端;  http服务器实际上就是一个tcp服务器,  只不过http客户端与服务端的通信使用的是http协议来约定数据格式而已

       简单的http服务器搭建

              1.搭建tcp服务端

              2.获取新建连接

              3.使用新建连接,  等待接收数据(http协议的请求数据)

              4.接收过程 : 先接收http头部,  解析头部-Content-Length确定正文长度

              5.接收指定长度的正文

              6.根据请求方法以及资源路径确定客户端的请求目的

              7.进行具体对应的业务处理

              8.组织http协议格式的响应数据,  对客户端进行回复

              9.如果是短连接,  则直接关闭套接字,  如果是长连接,  则继续等待接收数据

<html><body><h1>HELLO  WORLD</html></body></h1>

 

注意 : http服务器编写完毕后

        云服务器 : 记得设置安全组策略,  开启对应端口

        虚拟机 : 记得关闭防火墙  sudo 

 

 

 

     

posted on 2021-06-06 17:00  阿鑫来了  阅读(45)  评论(0)    收藏  举报