线程和进程的区别
1.进程是操作系统分配资源的基本单位,线程是操作系统调度资源的基本单位
2.进程拥有独立的地址空间,线程共享进程的地址空间
3.进程创建和销毁的开销大,线程创建和销毁的开销小
http/https的区别
http的端口是80,https的端口是443
http传输是明文的,而https传输使用ssl进行加密的,https的安全性更高
https需要申请证书,而http不要
TCP工作原理
三次握手
三次握手是用来初始化和确认TCP连接的过程。这个过程保证了双方都准备好进行通信,并且可以互相发送数据。以下是三次握手的详细步骤:
第一次握手:客户端向服务器发送一个SYN包,表示希望与服务器建立连接。
第二次握手:服务器接收到客户端的SYN包后,会回应一个SYN-ACK(同步确认)包,表示已经接收到请求并同意建立连接。同时,服务器也会发送自己的序列号给客户端。
第三次握手:客户端收到服务器的SYN-ACK包后,需要再次发送一个ACK(确认字符)包给服务器作为响应,确认连接建立。
通过这三次握手,客户端和服务器都确认对方的存在,并准备好了开始数据传输。
四次挥手
四次挥手是用来断开TCP连接的过程,确保双方都能安全地关闭连接而不会有未发送的数据丢失。以下是四次挥手的详细步骤:
第一次挥手:主动关闭方(通常是客户端)发送一个FIN(结束标志,Finish),表示想要断开连接。发送FIN只是表示这一方向的数据传输结束,但还可以接收来自另一端的数据。
第二次挥手:被动关闭方(通常是服务器)接收到FIN后,会回复一个ACK包,确认收到了关闭请求。
第三次挥手:当被动关闭方也准备好关闭连接时,它会发送自己的FIN包给主动关闭方。
第四次挥手:主动关闭方收到被动关闭方的FIN包后,会发送一个ACK包作为响应,并进入TIME_WAIT状态,等待一段时间以确保被动关闭方接收到ACK包。在这段时间之后,如果没有额外的数据要处理,连接就会被彻底关闭。
为什么不能减少或增加握手挥手的次数呢
为什么需要三次握手:
- 同步序列号:三次握手的主要目的是让客户端和服务器互相确认对方的存在,并同步双方初始序列号(ISN),这对于后续的数据传输至关重要。
- 防止旧连接初始化请求突然到达而造成混乱:三次握手可以有效避免因网络中滞留的旧SYN包引发的问题,确保新建立的连接不会与之前的旧连接混淆。
为什么不能减少到两次握手:
如果只进行两次握手(即客户端发送SYN后,服务器直接返回ACK并开始数据传输),那么无法保证服务器端已准备好接收数据。
为什么不能增加到更多握手:
降低性能
为什么需要四次挥手:
确保所有数据传输完毕:四次挥手允许每一端都有机会确保其所有待发数据已被发送,并接收到对端的确认信息,之后再正式关闭连接。
为什么不能减少到三次挥手:
如果尝试将四次挥手简化为三次,比如合并某一方的FIN和ACK包,则可能导致数据丢失的风险,因为这可能意味着一端在未完全确认另一端是否已完成数据发送的情况下就关闭了连接。