项目介绍
点击按钮或者摇晃手机,两个骰子摇晃改变。
王圆圆的每日报告
开始用Swift开发iOS 10 - 6 创建简单的Table Based App是basic风格的Table,这一部分将:
UITableViewController
代替 UITableView
参考链接:https://www.jianshu.com/p/25f062e903cf
作者:Andy_Ron
这篇文章将学习到:
事务的概念来自于两个独立的需求:并发数据库访问,系统错误恢复。
一个事务是可以被看作一个单元的一系列SQL语句的集合。
create index 索引名 on 数据库名(列名 DESC降序)
优点:加速查找
缺点:增删改的时候需要更新索引
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
注意,同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。
握手的时候,A和B打个招呼,B可以直接把自己的SYN信息和对A的回应ACK信息一起带上,但是挥手的时候,A说我要断开了,B还没发完最后的数据,因此需要先回应一下A,我收到你的断开的请求了,但是你要等我把最后的内容给你,所以这里分开了2步: (1)回应A; (2)发送自己的最后一个数据
原因是,担心网络不可靠而导致的丢包,最后一个回应B的ACK万一丢了怎么办,在这个时间内,A是可以重新发包的,但是超过了最大等待时间的话,就算收不到也没用了,所以就可以关闭了。
HTTP 协议构建于 TCP/IP 协议之上,是一个应用层协议,默认端口号是 80。
方法:如下。URL :www.baidu.com、版本:HTTP 1.1
Accept-Charset,表示客户端可以接受的字符集。
Content-Type是指正文的格式:POST 的请求,如果正文是 JSON。
缓存:
一、状态行:
状态码会反应 HTTP 请求的结果;短语会大概说一下原因。
二、首部:key value。Retry-After表示,告诉客户端应该在多长时间以后再次尝试。Content-Type,表示返回的是 HTML,还是 JSON。
HTTP协议采用“请求-应答”模式,当时用普通模式,即非持久连接的模式时,每个请求/应答客户端和服务器都要新建一个连接,完成之后立即断开连接(无连接的协议)
当使用Keep-Alive模式(持久连接)时,Keep-Alive功能使客户端到服务端的连接持久有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
通俗的讲,不用管线化的持久连接就是来一个请求就响应一个;
而管线化则是,把请求打包发过去,一起响应。
HTTPS并不是一个新协议,HTTPS就是HTTP加上加密处理(一般是SSL安全通信线路,TLS)+认证+完整性保护
原本HTTP先和TCP(假定传输层是TCP协议)直接通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP通信,相当于SSL被嵌在了HTTP和TCP之间。
HTTPS 在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的简单描述如下:
一、首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
二、客户端如果校验通过后,生成随机数,随机数使用公钥进行加密(RSA加密);
三、消息体的摘要进行MD5算法加密,此时就得到了RSA签名;
四、消息发送给服务端,只有服务端(RSA私钥)能解密。
五、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。
本质:get和post就是TCP连接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
总结:对于get和post的区别,get传递数据如同是写在脸上,post传递数据如同放在肚子里,脸上不能放太多东西,也不能放隐私东西,肚子里就无所谓啦~
建立TCP连接->发送请求行->发送请求头->(到达服务器)发送状态行->发送响应头->发送响应数据->断TCP连接
讲述一下计算机网络的七层
网际层协议:IP协议、ICMP协议、ARP协议、RARP协议
传输层协议:TCP协议、UDP协议
应用层协议:FTP、Telnet、SMTP、HTTP、RIP、NFS、DNS
如果将 TCP 比作成熟的社会人,UDP 则是头脑简单的小朋友。
包:源端口号和目标端口号+数据
UDP 是一个简单的传输层协议。和 TCP 相比,UDP 有下面几个显著特性:
适合情况:
实时游戏
移动通信领域
分析:
源端口号和目标端口号:数据知道发给哪个应用。
包的序号:那个包先来,那个后来
确认序号:发出去的包应该有确认,无确认再发一次。
状态位:SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接等。是面向连接的,因而双方要维护连接的状态,这些带状态位的包的的发送,会引起双方的状态变更。
窗口大小:标识自己当前能够的处理能力,让对方根据自己窗口来确定发送速度。
拥塞控制:控制自己发送的快慢。
作用:三次握手除了双方建立连接外,还获取TCP包的序号。
A:您好,我是 A。
B:您好 A,我是 B。
A:您好 B。
三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect()
时。将触发三次握手。
第一次握手(SYN=1, seq=x):
客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。
发送完毕后,客户端进入 SYN_SEND
状态。
第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。
发送完毕后,服务器端进入 SYN_RCVD
状态。
第三次握手(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1
发送完毕后,客户端进入 ESTABLISHED
状态,当服务器端接收到这个包时,也进入 ESTABLISHED
状态,TCP 握手结束。
以上就是TCP建立连接的三次握手过程,以上流程还需要补充的是:
A:B 啊,我不想玩了。
B:哦,你不想玩了啊,我知道了。(半关闭)
B:A 啊,好吧,我也不玩了,拜拜。
A:好的,拜拜。
客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close()
操作即可产生挥手操作。过程:
第一次挥手(FIN=1,seq=x)
假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。
发送后,客户端进入 FIN_WAIT_1
状态。
第二次挥手(ACK=1,ACKnum=x+1)
服务器收到 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。
发送后,服务器端进入 CLOSE_WAIT
状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2
状态,等待服务器端关闭连接。
第三次挥手(FIN=1,seq=y)
服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。
发送完毕后,服务器端进入 LAST_ACK
状态,等待来自客户端的最后一个ACK。
第四次挥手(ACK=1,ACKnum=y+1)
客户端接收到服务器端的关闭请求,发送确认包,进入 TIME_WAIT
状态,等待可能需要重传的 ACK 包。
服务器端接收到这个确认包之后,关闭连接,进入 CLOSED
状态。
客户端等待了某个固定时间(两个最大段生命周期,2MSL)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED
状态。
四次挥手的原因:
典型的场景是DDOS攻击,也可以说是tcp的SYN Flood攻击,又叫洪水攻击; 根据上面的分析,我们知道tcp的握手环节是比较耗时的,当client端发起连接请求的时候,server端会回应,然后等待client的最终确认信息,默认情况下的linux会等待1到63s这样(如果有特殊的设置,这个时间可以到1-2min这样),默认最长是63s之后才会断开,之前这段时间内属于半连接的状态,服务器不会丢弃掉这些连接,而是会等,试想如果有一个人突然想你的server瞬间之内发送了几千万个连接请求,但是对服务端的响应不做理睬,这样很容易就导致我们正常的tcp连接进不去,从而出现服务拒绝的情况,而他只需要一个简简单单的脚本去给你丢包就可以了,这种情况就会导致服务器对正常的客户端表现为宕机。。此种攻击的成本比较低,但是防护却特别麻烦,因为你必须要保证正常的不能因为访问次数的提高而出现拒绝。