第一步:客户端的TCP向服务端的TCP发送一个TCP报文段,SYN=1。
第二步:当报文段到达服务端时,服务器从数据报TCP发送允许连接的报文段(SYNACK报文段)。SYN=1。
第三步:收到SYNACK报文段后,客户为该连接分配缓存和变量。客户端向服务端发送一个报文段,对服务器的允许连接进行确认。SYN=0。
如果是一次握手,那么客户端连服务端有没有收到报文都不知道,不行。
如果是二次握手,那么当客户端与服务端建立连接之后,如果客户端之前丢失的报文再次传输到服务端,这时候服务端就会这个之前的报文进行确认,导致建立多个连接,发生错误。
如果是四次握手,那么服务端会在连接之后再发送一个确认报文,这个操作是可以的,但是没必要,浪费资源。
第一步:客户端发出一个关闭连接的报文段;
第二步:服务端接收到该报文之后,向客户端发送ACK报文段;
第三步:服务端发送自己的终止报文段;
第四步:客户端对服务器的终止报文段进行确认,两台主机的所有连接资源被释放。
因为客户端发送FIN报文,只是表示客户端想关闭连接,服务端可能还因为有数据在传输而不想关闭,等到服务端想关闭的时候自己再发送一个FIN报文去表示自己想关闭连接。
CLOSE_WAIT是TCP四次挥手的过程中,客户端已经关闭了连接,而服务端还没有关闭连接之间的一段时间。需要CLOSE_WAIT的原因就是客户端关闭连接之后,而服务端可能还想继续传送数据,就还没发起关闭连接的请求。
TIME_WAIT是TCP在四次挥手中客户端接受到服务端的请求终止报文(FIN),自己发送ACK之后的一个状态,等待若干时间后再把连接关闭。
需要等待的原因有:
1.当客户端收到服务端的请求连接报文后,会发送ACK进行确认,如果这个过程中ACK丢失了,实际上连接可以关闭,但服务端会错误地认为连接还没有关闭。因为有TIME_WAIT这个状态,如果客户端发送的ACK丢失了,可以再次发送ACK给服务端。
2.用于将服务器的资源释放,防止前一个连接的报文段被当作后一个连接的报文段,引起数据紊乱。
客户端
服务端
1) TCP是面向连接的,可靠性高;UDP是基于非连接的,可靠性低
2) 由于TCP是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差,同时过程复杂,也使其易于攻击;UDP没有建立连接的过程,因而实时性较强,也稍安全
3) 在传输相同大小的数据时,TCP首部开销20字节;UDP首部开销8字节,TCP报头比UDP复杂,故实际包含的用户数据较少。TCP在IP协议的基础上添加了序号机制、确认机制、超时重传机制等,保证了传输的可靠性,不会出现丢包或乱序,而UDP有丢包,故TCP开销大,UDP开销较小
4)每条TCP连接只能时点到点的;UDP支持一对一、一对多、多对一、多对多的交互通信。
5)TCP面向字节流,UDP面向报文。
数据在传输时,TCP会对所有数据进行编号,发送方在发送过程中始终保持着一个窗口,只有落在发送窗口内的数据帧才允许被发送;同时接收方也始终保持着一个接收窗口,只有落在窗口内的数据才会被接收。这样通过改变发送窗口和接收窗口的大小就可以实现流量控制。
窗口滑动协议是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待接收确认报文前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。
1)数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;
2)对失序数据包进行重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;
3)丢弃重复数据:对于重复数据,能够丢弃重复数据;
4)应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
5)超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;
6)流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。
流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。实现方式就是在滑动窗口机制中发送方的发送窗口不能超过接收方的接收窗口大小。TCP的窗口单位是字节,不是报文段。
现在考虑一种情况,就是接收方发送了接收窗口的大小为0之后,过了一段时间接收缓存又有了一些存储空间,这时接收方会发送一个报文段通知发送方可以继续发送报文段,但是这个报文段如果丢失了,那么发送方就会陷入等待接收方发送非零窗口通知的死锁之中。为了解决这个问题,TCP为每个连接维护一个持续计时器,只要接收方收到对方的非零窗口通知就启动持续计时器,若时间到期,就发送一个探测报文段去检测接收方是否有接收缓存。
拥塞控制就是防止过多的数据注入到网络中,这样能使网络中的路由器或链路不至于过载。
慢开始、拥塞避免、快重传、快恢复。
一开始发送方维持一个叫拥塞窗口(cwnd)的状态变量,发送方让自己的发送窗口等于拥塞窗口。
慢开始的思路是主机开始发送数据时,并不清楚网络的负荷情况,这时候并不需要把大量数据先注入到网络,而是由小到大逐渐增加发送窗口,即拥塞窗口的数值。使用慢开始算法在出现拥塞之前,每一个传输都会使cwnd数量加倍。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,需要设置一个慢开始门限(ssthresh)。
当cwnd < ssthresh时,使用慢开始算法。
当cwnd > ssthresh时,使用拥塞避免算法。
当cwnd = ssthresh时,以上两个算法都可以使用。
拥塞避免算法让cwnd每经过一个往返时间就增加1,即线性增长。而慢开始则是指数增长。
快重传可以让发送方尽早知道发生了个别报文段的丢失。具体就是接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
当发送方知道自己丢失了个别报文段的时候,就取消掉慢开始的算法,执行快恢复算法。发送方调整慢开始门限(ssthresh = cwnd / 2),同时设置拥塞窗口cwnd = ssthresh,并开始执行拥塞避免算法。
流量控制是指发送方的发送速率不要太快,让接收方可以来得及接收数据,是一个点到点之间通信量的控制。而拥塞控制就是防止过多的数据注入到网络中,使网络中的路由器或链路不至于过载,是一个网络环境的问题。
1.客户端向服务端发送请求连接数据包
2.服务端向客户端发送确认数据包
3.客户端不向服务端发送确认数据包,让服务器一直等待来自客户端的确认
1.限制同时打开SYN半链接的数目
2.缩短SYN半链接的Time out 时间
3.关闭不必要的服务
SQL注入就是把SQL命令恶意插入到web表单或域名中,最终达到欺骗服务器而执行恶意的SQL命令。
如果一个用户在web表单输入用户名后后台会处理下列语句
SELECT uid,username FROM user WHERE username='abc';
那么如果用户此时在表单输入
abc';SHOW TABLES-- hack
此时后台就会执行这条语句:
SELECT uid,username FROM user WHERE username='abc';SHOW TABLES -- hack
这个时候会将所有的表信息都返回出来。这是十分危险的。
如果用户输入:
abc';DROP TABLE user-- hack
这样还会删除所有表。
如果一个用户在web表单输入用户名和密码后会处理下列语句
SELECT uid,username FROM user WHERE username='a' AND password='e10adc3949ba59abbe56e057f20f883e'
但如果此时用户恶意输入以下内容:
a' AND 1=1-- hack
因为1=1是永远成立的条件,这意味着只要知道用户名就可以直接登陆进系统了。
对于服务器配置层面的防范,应该保证生产环境的Webserver是关闭错误信息的,比如PHP在生产环境的配置文件php.ini中的display_errors应该设置为Off,这样就关闭了错误提示,不让黑客有机会可以尝试我们的数据库信息。
1.参数绑定
使用预编译手段,绑定参数是最好的防SQL注入的方法。目前许多的ORM框架及JDBC等都实现了SQL预编译和参数绑定功能,攻击者的恶意SQL会被当做SQL的参数而不是SQL命令被执行。
2.过滤特殊符号
对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。以PHP为例,通常是采用addslashes函数,它会在指定的预定义字符前添加反斜杠转义,这些预定义的字符是:单引号 (’) 双引号 (") 反斜杠 () NULL。
XSS, 即为(Cross Site Scripting), 中文名为跨站脚本, 是发生在目标用户的浏览器层面上的,当渲染DOM树的过程成发生了不在预期内执行的JS代码时,就发生了XSS攻击。
HTTP有以下安全性问题:
1.使用明文进行通信,内容可能会被窃听;
2.不验证通信方的身份,通信方的身份有可能遭遇伪装;
3.无法证明报文的完整性,报文有可能遭篡改。
HTTPS是先让HTTP和SSL通信,再由SSL和TCP通信,也就是隧道通信。
通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
加密和解密使用同一套密钥。
优点:运算速度快。
缺点:无法安全地将密钥传输给通信方。
加密和解密使用不同的密钥。
优点:可以更安全地将公开密钥传输给通信发送方;
缺点:运算速度慢。
HTTPS 采用混合的加密机制,使用非对称密钥加密用于传输对称密钥来保证传输过程的安全性,之后使用对称密钥加密进行通信来保证通信过程的效率。
DNS提供的是将一个域名转换为IP地址的服务。
www.baidu.com
www是三级域名,baidu是二级域名,com是顶级域名。