一、TCP相关
1.TCP与UDP的区别
tcp协议和udp协议的差别
TCP | UDP | |
---|---|---|
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
有序性 | 有序 | 无序 |
速度 | 慢 | 快 |
应用场合 | http ftp smtp 文件传输 | 语音通话 视频通话 |
2.TCP简介
1、面向连接的、可靠的、基于字节流的传输层通信协议
2、将应用层的数据流分割成报文段并发送给目标节点的TCP层
3、数据包都有序号,对方收到则发送ACK确认,未收到则重传
4、使用校验和来校验数据在传输过程中是否有误
3.TCP三次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到SYN包,必须确认客户到的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
4.TCP首次握手的隐患--SYN超时
当客户端发送SYN包后断开连接,服务器会重试直至超时才会断开连接,这会导致恶意攻击占满队列。
针对这种情况,SYN队列满后,通过tcp_syncookies参数回发SYN Cookie,若为正常连接则Client会回发SYN Cookie,直接建立连接。
5.TCP四次挥手
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送一个ACK给Client确认序号为收到序号+1,Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给SERVER,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
6.TCP的滑动窗口
1、保证TCP的可靠性(顺序)
2、保证TCP的流量控制特性
二、HTTP相关
1.HTTP主要特点
1、支持客户/服务器模式
2、简单快速
3、灵活
4、无连接(1.1后新增长连接特性KEEP-LIVE)
5、无状态
2.GET和POST的区别
1、Http报文层面:GET将请求信息放在URL,POST放在报文体中
2、数据库层面:GET符合幂等性和安全性,POST不符合
3、其他层面:GET可以被缓存、被存储,而POST不行
3.Cookie和Session的区别
1、Cookie数据存放在客户的浏览器上,Session数据放在服务器上。
2、Session相对于Cookie更安全。
3、若考虑减轻服务器负担,应使用Cookie。
Cookie
1、Cookie是由服务器发给客户端的特殊信息,以文本的形式存放在客户端
2、客户端再次请求的时间,会把Cookie回发
3、服务器接收到后,会解析Cookie生成与客户端相对应的内容。
Session
1、服务器端的机制,在服务器上保存的信息
2、解析客户端请求并操作session id,按需保存状态信息
4.Http和Https的区别
1、Https需要到CA申请证书,Http不需要
2、Https密文传输(非对称加密),Http明文传输
3、连接方式不同,Https默认使用443端口,Http使用80端口
4、Https=Http+加密+认证+完整性保护,较Http安全
SSL
1、为网络通信提供安全及数据完整性的一种安全协议
2、是操作系统对外的API,SSL3.0后更名为TLS
3、采用身份验证和数据加密保证网络通信的安全和数据的完整性
Https数据传输流程
1、浏览器将支持的加密算法信息发送给服务器
2、服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器。
3、浏览器验证证书合法性,并结合证书公钥加密信息发送给服务器。
4、服务器使用私钥解密信息,验证哈希,加密响应消息回发浏览器。
5、浏览器解密响应消息,并对消息进行验证,之后进行加密交互数据。
Https真的很安全吗
浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
可以使用HSTS(Http Strict Transport Security)优化
Socket相关
BIO、NIO、AIO的区别
- BIO 就是传统的 [java.io]包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。
- NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。
- AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
多路复用器Selector
selector简称多路复用器,它是JAVA NIO编程的基础简单来讲,selector会不断轮询注册在其上的channel,如果某个channel上面发生了读或者写事件,这个channel就会处于就绪状态,会被selector轮询出来,然后通过selectorKey可以获取就绪channel的集合,进行后续的io操作。
一个多路复用器selector可以同时轮询多个channel,由于jdk使用epoll()替代传统的selector实现,所以他并没有最大连接句柄限制,也就意味着只需要一个负责轮询selector的线程就可以接入成千上万的channel.
select和epoll区别
select比epoll效率差的原因:select是轮询,epoll是触发式的,所以效率高。
Select:
1.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.
2.操作限制:通过遍历FD_SETSIZE(1024)个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍.
Poll:
1.Socket数量几乎无限制:该模式下的Socket对应的fd列表由一个数组来保存,大小不限(默认4k).
2.操作限制:同Select.
Epoll:
1.Socket数量无限制:同Poll
2.操作无限制:基于内核提供的反射模式,有活跃Socket时,内核访问该Socket的callback,不需要遍历轮询.但是当所有Socket都活跃的时候,这时候所有的callback都被唤醒,会导致资源的竞争.既然都是要处理所有的Socket,那么遍历是最简单最有效的实现方式.
网友评论