TCP延迟确认:
如果收到一个包之后暂时没有什么数据需要发送对方,那就延迟一段时间(在windows默认为200ms),假如这段时间恰好有数据要发送,那确认信息就随数据一同发出。
微软KB328890提供关闭延迟确认的步骤。
Nagle算法:
在发出的数据没有被确认之前,假如又有小数据生成,那就把小数据收集起来,凑满一个MSS或者等收到确认后再发送。
UDP协议的优势:
UDP净荷高。
没有Seq和Ack,不建立连接,效率高
UDP协议的劣势:
没有MTU的概念,网络层分片导致性能占用。
没有重传机制,应用层决定丢包处理。
分片机制容易遭受攻击。
CIFS:
CIFS使用TCP的445端口。支持SMB,SMB2,SMB3(其中SMB2普遍)
客户端把自己所有支持版本告知服务器端,服务器端挑出回复自己支持的最高版本。
CIFS的session身份验证方式有Kerberos和NTLM。
Session Setup后客户端打开共享路径,操作称为Tree Connect,服务器返回的Tree ID,客户端利用这个ID去访问目录和文件。Tree Connect不检查权限,即使无权限客户也能得到,检查权限的工作由Create操作完成。Create操作是涉及新建,打开,读取等动作。
常见问题:
如果对文件夹禁止用户访问,但是下面一个文件允许访问,则用户无法打开对应目录,但是能直接打开那个文件。
Windows的备份是Create请求中“Backup Intent”设1,读取为0,服务器可以根据这个字段来根据备份和读取权限来决定是否准许访问。
Access Mask是“读写”,Share Access Mask是“读”,如果有人读写,另一个人请求读写就会收到“Sharing Violation”错误。
CIFS来解决缓存数据一致性,采用Oplock(机会锁),有Exclusive(允许读写缓存),Batch(允许所有操作缓存)和Level2(允许读缓存)三种形式。
(1)windows xp的SMB是一去一回,windows 7是多发多收,所以在网络质量不好的地方,差距挺大。
(2)Windows Explorer从CIFS上复制文件比Robcopy和EMCopy慢,是因为它是单线程的。
(3)CIFS共享中,复制一个文件粘贴到同一个目录是把内容复制到客户端内存,再从客户端内存写到服务器上,,而粘贴到客户端本地硬盘当然会比它快。SMB3才改进了这点,实现服务器端本地复制。
(4)剪切粘贴非常快是因为只是一个“rename”操作。
(5)SMB2没有SMB协议这么啰嗦,所以读性能提高很多。
SMB3(Win8和10和2012)改进了复制粘贴在网络上跑两次的问题,是运用给客户端一个Token,客户端利用Token给服务器发写请求实现的。
SMB3还实现了双网卡在CIFS层的负载均衡,一个SMB3 Session的诸多TCP分摊在两块网卡上,即使网卡瘫了一块,SMB3连接还能存在。
SMB3还把文件锁之类的信息存在硬盘上,当双机头的架构中,主机头挂了,备机头起来便能获得此信息,从而提供无缝服务。
DNS相关:
A记录:域名解析到IP
PTR记录:IP地址解析到域名(nslookup 跟上IP)
SRV记录:查找域控
CNAME记录:别名
DNS的放大攻击:伪造DNS请求包的源IP,大量发送请求包,那个IP就会收到完全不对称般大量的DNS响应包。
FTP主动模式:客户端通过21端口连接服务器,但是数据传输是由服务器从20端口主动连接客户端协商好的随机高端口。
FTP被动模式:数据传输时,也是由客户端发起连接的。
根据密钥解密https流量:
Edit→Preferences→Protocols→SSL→RSA keys list,然后按照IP,Port,Protocol,Private Key格式填写RSA keys list一行
Kerberos认证原理:
原始版本:
A用hash把密码转成一把密钥Kclt,用kclt把当前时间戳加密生成一个字符串“时间戳Kclt”,把“时间戳kclt”和帐号A的信息,以及一段随机字符串发给KDC组成身份认证请求AS_REQ。KDC收到AS_REQ后,读到帐号A的信息,调出密码,在用hash转换成Kclt解开“时间戳Kclt”,能解开就表明请求是帐号A生成的。
选用时间戳是为了防范黑客的重放攻击,用时间戳,只要NTP是同步的,时间间隔相差太大就认为是重放攻击。
KDC在用Kclt加密随机字符串,帐号A拿到回复后能否解出就能判断KDC的真假。
以上过程中双方都没有向对方发送密码,即便一方是假的也不会泄密。
但是有问题就是每次认证都要调出密码执行hash解密,对KDC的性能要求太大。
改进版本:
KDC生成两把一样的密钥Kclt-Kdc,把密码hash成Kkdc,然后用它加密那把委托给A的密钥,委托密钥称为TGT,KDC只需记住自己的Kkdc,就能解开委托给帐号的TGT,从而获得与该帐号之间的密钥,KDC的负担大大降低。KDC回复给A的AS_REP需要包含TGT,“(Kclt-kdc,时间戳,随机字符串)Kclt”
A收到AS-REP后利用Kclt机密“(Kclt-kdc,时间戳,随机字符串)Kclt”,判断KDC真实性,把Kclt-kdc和TGT保存备用。
账号A请KDC帮忙认证资源B:
A将TGT,帐号A信息,时间戳,要访问的B的资源发给KDC,这个请求叫TGS-REQ。
TGS_REQ=TGT,{帐号A信息,时间戳}Kclt-kdc,资源B相关信息
KDC收到TGS-REQ后,用Kkdc解密TGT得到Kclt-kdc,再用Kclt-kdc解密A的信息和时间戳验证身份,确认A为真。
KDC生成两把相同的密钥给A和B使用,称为Kclt-srv,其中一把密钥给A,另一把委托A给B,Kerberos把B的密码hash成Ksrv,然后用它加密委托给A转交B的Kclt-srv,只能B能解开这条Ticket。
Ticket={帐号A的信息,Kclt-srv}Ksrv
TGS_REP={Kclt-srv}Kclt-kdc,Ticket
账号A收到TGS_REP后,用Kclt-kdc解开{Kclt-srv}Kclt-kdc,得到Kclt-srv,Ticket发给B,以后多次访问B都可用这个Ticket,不用每次向KDC申请,降低KDC负担。
帐号A和帐号B互相认证:
帐号A给B发送“{帐号A的信息,时间戳}”Kclt-srv,以及上一步收到的Ticket,请求称为AP_REQ。
AP_REQ=“{帐号A的信息,时间戳}Kclt-srv”,Ticket
B能用Ksrv解开Ticket得到Kclt-srv,用Kclt-srv解开“{帐号A的信息,时间戳}Kclt-srv”,B就能确认A为真,回复AP_REP来证明自己也是真的。
AP_REP={时间戳}Kclt-srv
帐号A利用Kclt-srv解密AP-REP,通过得到时间戳来判断对方是否为真。
Wireshark解密查看必须Edit→Preferences→Protocols→KRB5,keytab file输入key的路径才能解密。
客户可以用\\IP地址 访问,但是用域名就不行:
用IP是NTLM身份认证的,用域名则是Kerberos认证的,机制不一样,注意时钟,NTLM不会因为怀疑重放攻击拒绝访问。
SACK机制(Selective Ack):
如果一个包丢了,接收方发现了,那这个包后续的包也要重传,因为无法确定是否也丢失,但是接收方虽然知道丢了哪些包没法告知发送发,RFC2018中给出了方案,SACK启用的情况下,接收方能告诉发送方,它只需要重发的那个包,可以减少大量不必要的重传。
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。