TCP UDP 优缺点

  • tcp:面向连接点到点、可靠、无结构的字节流,全双工
  • udp:支持1:n,1:1,n:1,没有阻塞控制。尽最大努力交付不可靠,报文
TCP: 可靠、稳定。

使用场景:数据必须准确无误的传输,不允许丢失。基于tcp的协议有http、https、ftp文件协议、smtp邮件协议、ssh协议

优点:

  • 其中tcp会在传输数据前,建立3次握手,
  • 在传输数据时,有确认、窗口、重传、阻塞控制机制
  • 传输完毕后,断开连接节约系统资源(4次挥手:)

缺点:

  • 慢,效率低,在tcp传输之前容易被攻击
  • 发送数据前需要建立3次握手会消耗,所以出现了池化的概念,例如mysql、redis这类始终保证n个一直处于链接的定期发送心跳或者ping包
  • 数据传输中,有确认进制、重传机制、阻塞机制等也是消耗时间的。当网络不佳的情况会重传

三次握手:

需要双端都准备就绪。序号是防止一端旧的数据包干扰。

  • 客户端发送 SYN=1,seq=j到服务端
  • 服务端接收到会回复SYN=1,ACK=1,ack=j+1,seq=K, 此时需要等待客户的ack,这块也就是攻击的阶段,也是为什么三次握手的原因,一次发送了syn和ack没有单独发送
  • 客户端发送ACK=1,ack=K+1

四次挥手:

主要是是因为TCP是全双工的,即可以发送、又可以接收。四次挥手是确保资源彻底的释放。后续的链接可继续使用

具体如下

  • 客户端主动断开,发送FIN 到服务端,这时客户端还可以发送数据,只是不在接收数据(数据报文不是指令ack)
  • 服务端ack 后进入close_wait。
  • 服务端也发送FIN数据包,
  • 客户端收到后,发送ack响应服务端。此时服务端进入关闭。这时,客户端不会立即释放本地与服务器关系。有一个time_wait。超时释放,主要确保服务器端完全释放。其他客户端才可以继续使用之前的端口(游离状态了),也保证发送中的数据发送完毕。
UDP

QQ语音、QQ视频、TFTP(例如以前在搞路由器开发,使用tftp作为固件下载服务器)

优点:

  • 快,针对tcp,没有握手、确认、窗口、重传、阻塞等机制
  • 无状态
  • 不可靠,不稳定:在网络环境不好的情况下容易丢失,比较适合视频、语音都几个包不影响整体视觉效果和语音内容。

攻击与防护

  • TCP SYN泛洪攻击: (netstat -nap | grep SYN_RECV) 伪造大量的源ip发送到服务端,服务端发送ack+syn,这时处理半链接状态等待客户端的ack会超时重试。会造成系统资源的浪费。防范是缩短syn的timeout时间。让系统尽早释放半链接。或者采用(syn cookie有问题会拒接协议tcp选项窗口、时间戳,后来出现了tcpct但是需要双端支持不懂)
  • UDP UDP Flood攻: 伪造源ip地址发送大量的小UDP包,可以规范包的大小,过长丢失。存在误伤。这类防御尽量使用专业的防火墙或者其他的设备。UDP不好防护

HTTPS

浏览器会存在一次第三方ca机构的根证书

  • 浏览器发起请求后,从服务器获取公钥证书
  • 浏览器接收到公钥证书后,进行证书验证:是否在有效期内、是否被吊销(浏览器定期会同步一份)
  • 浏览器使用随机数(client + server)生成加密的会话密钥。然后使用公钥加密发送给服务端; 此处经常报“ssl_handshake”字眼的错误(加密套件过期、不支持)
  • 使用最终协商的秘钥进行数据传输,发送时加密,接收时解密。

SSL/TLS

握手阶段

  • 浏览器发送加密请求,简称ClientHello(协议版本、客户端随机数、支持的加密方法、支持的压缩方法…)
  • 服务器回应,简称ServerHello(确认使用加密的版本,服务端随机数、确认加密方法(RSA)、服务器证书),如果是双向认证,需要发送客户端证书
  • 客户端收到回应后,验证证书是否过期、域名是否一致(泛域名)、可信ca机构否则会有警告,验证通过,从证书中提取公钥
  • 客户端发送通知,1.公钥加密一个新的随机数(pre-master key 即会话密钥)2.编码改变,使用新的协商的加密方法和密钥发送。3.客户端握手结束通知,将前面发送的所有内容的hash值发送给服务器进行校验
  • 服务端回应:确定编码改变、服务器握手接收也会发送之前发送所有内容的hash值给客户端校验。

pre-master key:是参与会话密钥的,最终密钥是在服务端和客户端自己计算的,因为之前已经产生client hello,server hello随机数。通过双方协商的加密算法,使用这个三个值计算出来会话通信加密密钥的