对付运用层开拓职员,打仗最多的网络协议常日都是传输层的TCP,为什么这么说,由于再往上的运用层协议,如:HTTP、HTTPS、POP3、SMTP、RPC、FTP、TELNET等等都是基于TCP传输层协议。但对付IP协议,对付运用程序员来说更多的印象还是IP地址这个东西,实际上IP协议是位于TCP协议之下的网络层,对付运用层程序员来说很难直接打仗
IP协议: IP的任务便是把数据从源传送到目的地。它不卖力担保传送可靠性,流掌握,包顺序和其它对付主机到主机协议来说很普通的做事
TCP协议:TCP(Transmission Control Protocol 传输掌握协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议

HTTP协议:HTTP 是基于 TCP/IP 协议的运用层协议。它不涉及数据包(packet)传输,紧张规定了客户端和做事器之间的通信格式,默认利用80端口
1.1 TCP协议的3次握手
在我们得到页面数据之前,客户端须要与做事器端进行三次握手的\"大众问候\公众
大略来说:
1, 客户端向做事器发起问候,携带编号number
2, 做事器如果收到客户真个问候,回答问候,携带其他编号number
3,客户端确认连接成功,回答做事器收到返回的数据
687474703a2f2f6f6f327239726e7a702e626b742e636c6f7564646e2e636f6d2f3630363537332d32303137303331373139313333363933322d313635343735313132332e706e67.png
为什么是3次握手?
这个问题的实质是, 通信不可靠, 但是通信双发须要就某个问题达成同等. 而要办理这个问题, 无论你在中包含什么信息, 三次通信是理论上的最小值
已失落效的连接要求报文段的产生在这样一种情形下:client发出的第一个连接要求报文段并没有丢失,而是在某个网络结点永劫光的滞留了,甚至耽误到连接开释往后的某个韶光才到达server。本来这是一个早已失落效的报文段。但server收到此失落效的连接要求报文段后,就误认为是client再次发出的一个新的连接要求。于是就向client发出确认报文段,赞许建立连接。假设不采取“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的要求,因此不会答理server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一贯等待client发来数据。这样,server的很多资源就白白摧残浪费蹂躏掉了。采取“三次握手”的办法可以防止上述征象发生。例如刚才那种情形,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有哀求建立连接 4次分离怎么回事TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1见告主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接管来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会见告主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要精确的理解四次分离的事理,就须要理解四次分离过程中的状态变革2.0 要求报文在结束协议的连接之后,客户端向做事器正式发起要求
发起要求的时候,须要详细先容当前的要求情形,方便做事器做出快速相应
要求报文的常见格式
要求报文包含 要求行--要求头--要求体
要求行
要求办法 + 空格 + 要求路径 + 空格 + HTTP协议版本
=> GET /demo.php HTTP/1.1
要求头
Host 要求的主机
Cache-Control 掌握缓存(例如:max-age=60 缓存60秒)
Accept 客户端想要吸收的文档类型,逗号分隔
User-Agent 标识什么客户端帮你发送的这次要求
Referer 这次要求的来源
Accept-Encoding可以接管的压缩编码
Cookie 客户端本地的小票信息
要求体
客户端须要向做事端发送的内容
get要求,会把基本的参数拼接到url的后面,以是基本利用不上要求体post要求利用要求体会比较频繁3.0 要求样式文件要求css文件
虽然要要求的是css文件,但是link的是php文件
由于php是后台文件,终极是在php中返回内容给浏览器,并且可以设置当前的文件类型
<link rel=\"大众stylesheet\公众 href=\公众css.php\"大众 />在css.php中书写的代码<?php // 设置相应头的类型 header(\"大众Content-Type:text/css;charset=utf-8;\公众); echo \"大众body{background:red;}\公众;?>
eader方法发送重定向操作
页面跳转<a href=\"大众data.php\"大众>点击重定向</a>在data.php中完成跳转<?php // 立马做出跳转 // header(\"大众Location:01-getsmt.php\"大众); // 在指定的韶光之后跳转 header(\"大众refresh:3;url=01-getsmt.php\公众);?>
header方法实现下载功能
<?php // 实现当前页面的自动下载 header(\"大众Content-Type:application/octet-stream\"大众); // 指定文件名称, 自动下载,设置下载名称 header(\"大众Content-Disposition:attachment;filename=tmp.php\"大众); ?>
设置要求头制作图片防盗链
<?php // 获取要求报文数据 // print_r(getallheaders()); $refer = getallheaders()[\"大众Referer\公众]; echo $referer; // http:127.0.0.1/day04/03-test.html // 获取url中各个部分的值 print_r(parse_url($referer)); / Array( [scheme] => http [host] => 127.0.0.1 [path] => /day04/03-test.html ) /?>4.0 HTTP协议无状态
HTTP会话
客户端打开与做事器的连接发出要求到做事器相应客户端要求的全过程称之为会话
HTTP无状态
HTTP协议,本来是进行共享多个打算机之间的文件而产生的文件传输协议
而要求的时候,做事器没有记录当前的信息
就比如,去火车站取票,刷身份证拿到票之后,全体会话结束,不会有任何记录
==============
动态网站的涌现,表单提交,购物车的DOM操作,付款的跳转...
有了交互的须要,须要携带一些数据在不同页面之间跳转,无凭无据的,可如何是好
5.0 Cookie关于cookie的描述
由于HTTP协议是无状态的,即做事器不知道用户上一次做了什么,这严重阻碍了交互式Web运用程序的实现。在范例的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。末了结帐时,由于HTTP的无状态性,不通过额外的手段,做事器并不知道用户到底买了什么,以是Cookie便是用来绕开HTTP的无状态性的“额外手段”之一。做事器可以设置或读取Cookies中包含信息,借此掩护用户跟做事器会话中的状态。在刚才的购物场景中,当用户选购了第一项商品,做事器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给做事器,于是做事器知道他之前选购了什么。用户连续选购饮料,做事器就在原来那段Cookie里追加新的商品信息。结帐时,做事器读取发送来的Cookie就行了。Cookie另一个范例的运用是当登录一个网站时,网站每每会要求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会创造没输入用户名和密码就已经登录了。这正是由于前一次登录时,做事器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,做事器验证凭据,于是不必输入用户名和密码就让用户登录了。cookie小结
cookie是一个文件,用来存储当前的一些信息和做事器保持互换
在前端先容的sessionStorage和localStorage也是类似的功能
利用cookie
<?php // 创建cookie // setcookie(\公众username\公众, \"大众tylor\公众); // 可以在要求头中查看 // 判断是否拥有某个指定名称的cookie值 -- $_COOKIE if(isset($_COOKIE[\"大众username\"大众])) { echo \"大众欢迎回来,朕的小仙女\"大众; }else { echo \公众大人头一回来,是打尖儿还是住店呀~\"大众; setcookie(\"大众username\公众, \"大众tylor\公众); } ?>chrome: 设置 => 更多设置 => 内容设置 => cookie 可以看到明文存储的cookie设置的值;
cookie的参数
cookie的有效期<?php // 韶光是秒, 韶光参照php的默认起始韶光(1970-1-1) // setcookie(\"大众username\"大众, \公众tylor\"大众, 100); setcookie(\"大众username\公众, \公众tylor\公众, time() + 10); // 设置永久的韶光 setcookie(\"大众username\"大众, \"大众tylor\"大众, PHP_INT_MAX);?>
cookie的有效目录
<?php // 在不同的文件夹输出cookie中的键 echo $_COOKIE[\"大众username\"大众]; // 通过path可以设置访问权限,参照网站根目录 setcookie(\"大众username\"大众, \公众tylor\"大众, PHP_INT_MAX, \"大众/day05/down\"大众); // 设置父级目录,子目录可以访问,设置子目录,上层不能访问 \"大众/\"大众 代表整站可以访问 // Domain: 域名 path: 路径 secure:只有在https这类安全的协议下才会发送 // 某网站中显示的cookie // set-cookie: ds_user_id=3265153328; Domain=.instagram.com; expires=Wed, 13-Feb-2019 14:19:35 GMT; Max-Age=7776000; Path=/; Secure?>
删除cookie
<?php // 处理删除cookie的php文件 // 1.0 怎么创建的就怎么删除的 // setcookie(\公众username\"大众, \"大众\"大众); 如果开始不是这样设置的,这样删除就弗成 setcookie(\公众username\"大众, \公众\"大众, PHP_INT_MAX, \公众/day05/down\公众); echo \"大众ok\公众; // 2.0 设置一个过期韶光,也是可以删除的 ?>
关于cookie的毛病
Cookie会被附加在每个HTTP要求中,以是无形中增加了流量由于在HTTP要求中的Cookie是明文通报的,以是安全性成问题,除非用HTTPSCookie的大小限定在4KB旁边,对付繁芜的存储需求来说是不足用的作者:羽翼的翼
链接:https://www.jianshu.com/p/2ae7702aa844