Http相关简介
Http是应用层的基于请求响应的一个协议, 其中Http的请求响应可以分为四部分. 请求行, 请求报头,空行, 请求正文.其中请求行包括了请求方法, url, 版本号, 请求报头包括请求属性, 冒分割的键值对, 每组属性之间都以换行的形式分开, 最后一空行作为请求的结束标识. 最后一部分是请求正文.当请求正文存在的时候, 会在头部信息中有一个Content_Length的属性标识正文段的长度.
Http响应也包括四部分, 响应行, 响应报头, 空行, 响应正文, 其中响应行包括版本号, 状态编号, 状态描述, 响应正文也是以key:value的形式存在, 其中每一个响应属性之间以换行为结束表示, 第三部分为空行, 最后一部分为响应正文, 其中当响应正文存在的时候, 响应报头中会存在一个Content_Length用来表示响应正文的长度
网络中数据的传输
客户端发在浏览其中输入一个url此时会经过以下几个步骤
1.客户端在浏览器输入一个url
2.浏览器查询当前浏览器的缓存, 系统缓存, 路有缓存, 如果缓存中有用户输入的url就直接将内容显示给用户, 如果没有继续查找
3.系统查找系统缓存, 查看是否有域名IP地址,如果有, 则继续查找, 如果没有, 继续查看找
4.路由器查找路由缓存, 如果有对应的IP地址则返回, 否则继续查找
5.本地域名服务器采用迭代的方式进行查询, 先向根域名服务器进行查询
6.根域名服务器告诉本地域名服务器下一次应该访问的服务器的IP地址,
7.本地域名服务器拿着这个IP地址到顶级域名服务器访问对应的资源,
8.顶级域名服务器此时告诉本地域名服务器下一次应该查询的权限域名服务器的IP地址
9.本地域名服务器此时会向权限域名服务器进行访问查询
10.权限域名服务器告诉本地域名服务器所要查询的资源对应的主机的IP地址
11.此时本地域名服务器查询到资源后将自己查询到的IP地址告诉给主机
12.主机浏览器获取到Web服务器的IP地址后,与服务器建立TCP连接
13.此时浏览器所在的客户机 通过这个IP地址给对应的服务器发送一个请求连接的报文
14.服务器接收到主机发来的请求后向客户机发出对应的应答报文,同时也给客户机发送一个请求连接报文
15.客户机接收到这个请求后给服务器发送一个确认报文
16.此时客户机和浏览器之间建立了连接完成, 开始通信
17.浏览器发出对应的文件请求
18.服务器对浏览器发出的文件请求进行响应, 将用户想要访问的信息发送给浏览器
19.浏览器释放连接, 向服务器发送一个FIN 报文
20.服务器接收到这个FIN报文的时候给对应的客户机发送一个ACK报文表名自己同意释放链接, 同时服务器会给用户发送一个FIN报文, 表名自己请求释放连接
21.客户机接收到FIN报文后给服务器发送一个ACK报文, 表名自己受到FIN报文,
22.连接释放, 双方停止发送数据
Http的特点
简单快速, 服务器的规模小, 通信速度很快
Http允许传输任意类型的数据对象, 传输的类型由Content_type标记
无连接, 每次连接只处理一个请求, 处理完请求后就进行关闭
协议本身不会保存用户请求和响应
URL & URI & URN
URI是一个统一资源标识符, 它只是一个资源的标示
URL 是一个更加具体的URI, 可以通过URL定位到该资源存放在哪里, 并且可以得知如何获取到该资源.每个网页都对应一个URL地址(俗称网址),具有全球唯一性。它包含的信息指出文件的位置以及浏览器应该怎么处理它。 一个完整的URL包括协议类型、主机类型、路径和文件名
URN 通过名字标识一个资源
Http请求方法
GET方法
如果浏览器访问资源的方法是GET方法, 此时就会将用户请求的关键字拼接到URL后面, 同时GET方法可能带参数也可能不带参数
POST方法
POST方法不会将用户提交上去的数据放到url中, 它会将用户提交上去的数据放到正文中
CGI
浏览器除了从服务器上获取一些资源之外, 有时还需要向服务器上提交一些数据, 为了实现网页的交互性, 此时就需要以CGI机制来运行
当用户访问的资源具有可执行的时候, 此时程序就要以CGI的形式进行运行, 其中CGI的运行有两种可能, 一种是当请求的方法是POST, 另外一种就是当请求的资源是GET, 并且在URL中带了参数, 此时的运行方式即就是CGI运行方式
Http响应状态码及其描述
2XX成功
200: 请求访问被正确处理
204: 请求结果被正确处理, 但是响应信息没有响应正文
206: 客户端对服务器进行了范围请求, 服务器成功执行了GET 请求, 响应报文包含了Content-Range指定的实体内容范围
3XX成功
浏览器为了正确出处理请求需要执行一些特殊的处理动作
301永久性重定向:资源被重新分配了新的url, 要想访问该资源就得以新的url去访问资源
302临时性重定向: 目标资源暂时被分配了新的url,需要访问就得以新的url进行访问
4XX客户端错误
400 请求错误:表示请求报文中存在语法错误, 服务器无法解析该请求, 需要修改请求内容, 重新发送.
403 浏览器访问的资源被服务器拒绝. 服务器没有必要给出详细的理由
404 请求的资源不存在
5XX服务器错误
500 服务器端在执行的时候发生了错误
503 服务器处于超载状态, 目前正在维护, 无法请求处理.
MySlq相关接口
mysql_get_client_info()//引入对应的MySql库
MySql* mysql_init(MySql* mysql);//初始化
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char* db,unsigned int port,const char* unix_socket,unsigned long clientflag);//连接数据库int mysql_query(MYSQL* mysql, const char* q);//下发MySql命令MYSQL_RES *mysql_store_result(MYSQL* mysql);//读取结果unsigned int mysql_num_fields(MYSQL_RES *res);//获取列数MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);//获取列名void mysql_close(MYSQL* sock);//关闭MySql连接
项目分析
1.用户在浏览器上输入一个url
2.服务器将用户的请求进行分析, 向用户发出Http响应, 最终将用户请求的资源以一个html页面展示给用户
3.当用户请求的资源是一个可执行程序的时候, 此时就会进行简单的cgi运行, 最终将运行的结果展示给用户
4.当用户输入数据, 服务器将对应的数据插入到数据库中
5.服务器将对应的数据库的信息以html页面的格式展示给用户
项目实现思路
1.创建套接字
2.将对应的请求处理(将所有的换行都转换为反斜杠n)
3.对读取到的请求报文进行分析, 提取对应的方法, 判断该方法是GET 方法还是POST方法
4.如果是GET方法, 就直接判断资源请求的资源是否存在, 资源如果存在, 就将该资源返回给用户, 如果该资源不存在, 就返回404页面, 如果请求的资源是一个目录就将返回一个首页给浏览器
5.如果是POST方法, 就以cgi机制运行, 同时将正文的长度获取, 以进行参数获取
项目中的CGI运行机制
首先判断方法是GET 还是POST, 如果是GET方法, 那么此时的参数已经获取到(通过url放到了对应的query_string 中)此时就将请求行请求正文全部读完, 如果是POST方法, 此时就需要读取请求报头获得Content_length, 通过Content_length获取参数.然后将发送响应行首信息.此时就会出现一个问题, 既然是CGI机制, 那么就需要在一个集成中取执行另一个可执行程序, 此时就需要创建一个子进程, 但是子进程和父进程之间是独立的, 父进程想要拿到子进程的运行结果就必须将两个进程之间进行关联, 此时就需要引入管道实现进程间通信.
子进程需要执行另外一个可执行程序的话就需要程序替换, 程序替换回将当前的数据和代码全部替换, 此时如果将其替换掉, 子进程还怎么拿到对应的数据, 这个时候就引入了环境变量, 为了读写方便, 将管道直接重定向到对应的0和1中, 此时父进程只需要将子进程的执行结果拿到之后将其交给浏览器即可, 子进程只需要从父进程那里将数据拿到即可
总结一下:
父进程:
创建两个管道, 关闭相应的文件描述符
POST:继续读取数据, 直到读完POST的参数部分
GET直接从子进程那里读取结果
将数据和方法全部交给子进程等待子进程结果
子进程:
关闭相应的文件描述符
重定向标准输入标准输出
通过环境变量传去参数
进程程序替换
错误处理
将对应的请求处理完之后, 发出对应的响应, 然后在正文中将404页面发出去
部分图片展示