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

浙公网安备 33010602011771号