0%

面试时无数次被问到这个知识点,但是回答的时候总是不够特别详尽以及需要面试官再次追问。所以最好一次性就能把所有这块知识点回答完才算是合格的准备。

TCP三次握手

TCP三次握手过程

客户端一开始处于closed状态,开启三次握手,发送一个SYN给服务端进入SYN_SENT状态,TCP报文中seq的初始值是随着时间而变化的一个值,防止在网络中延迟的分组在以后又被传送导致某一方对它做出错误的解释;服务端接收到SYN后,进入SYN_RECV的状态,延迟一段时间后发送自己的SYN/seq和对客户端SYN的一个确认ACK/ack,报头中确认号的值是seq+1因为ack本身也占了一位,延迟确认可以降低网络流量,以及减少网络中小的报文段;客户端接收到服务端的ack后,发送对服务端SYN的确认,此后双方进入ESTABLISHED状态。

为什么不能是两次握手?TCP三次握手可以进行优化嘛?TCP可以在握手期间传送数据嘛?这其实都是一个问题,就是探讨两次握手会造成什么危害。

个人理解的是,TCP两次握手是客户端接收到服务端的SYN和ack双方就默认建立连接。假设客户端之前发送的SYN报文在网络中遗失,当再次发送到服务端时,服务端误以为要建立连接,就直接维护了这个连接并返回ACK,但客户端并没有数据需要传输,浪费了服务器的性能。

SYN洪水攻击

针对三次握手过程,而产生的一种攻击方式。客户端和服务器使用TCP协议发起会话时,会在内存中开辟一小块缓冲区来处理会话过程中的消息交换。

1)大量虚假ip发送SYN:服务器返回ack找不到地址,触发重传机制

2)拦截客户机应答报文:两次握手后,拦截客户端对服务端的应答,服务端收不到ACK会再次发送第二次握手确认报文。

TCP四次挥手

客户端和服务端双方初始状态为ESTABLISHED,客户端发送一个FIN/seq,进入FIN_WAIT_1状态;服务端接收到FIN后,返回一个ACK/seq+1,表示知道对方要关闭连接,进入CLOSE_WAIT被动关闭状态。等服务端也没有数据需要发送后,会给对端发送一个FIN/seq,表示自己要关闭连接,进入LAST ACK状态;客户端接收到后,返回一个ACK/seq+1进入TIME_WAIT状态,时间为2MSL,避免服务端没有收到此ACK再次发送报文。

什么是缓存

缓存是数据交换的缓冲区,某一硬件读取数据时总是先从缓存中查询,不存在时去内存找,内存找不到再去外存中查找。

功能

实现高性能和高并发(服务器)

应用场景

操作系统磁盘缓存——减少磁盘机械操作

数据库缓存——减少文件系统的IO次数

应用程序缓存——减少对数据库的查询

Web服务器缓存——减少应用服务器请求

客户端浏览器请求——减少对网站的访问

Read more »

makefile

1)如果不把生成的最后执行的文件放在第一行,输入make它就默认只执行第一行的code。
2)如果是在centOS7下面拷贝的话,会自动转换TAB为空格,然后编译命令失去作用。

线程池

只适用于无状态的服务器,因为不能保证是同一个工作线程处理多个客户请求。同一个连接上的客户请求,可能由不同的线程来处理。

pthread_create()函数

pthread_create函数第三个参数必须指向一个静态函数(static),否则编译没办法通过。如果想在static函数中使用类的动态成员(如成员函数和成员变量),通过以下方法来实现:
1)通过类的静态对象来调用;
2)将类的对象作为参数传递给静态函数,然后在静态函数中引用这个对象,并调用其动态方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
class threadpool{
private:
static void* worker(void* arg);
void run();
public:
...
};

void* threadpool::worker(void* arg){
threadpool* pool = (threadpool*)arg;
pool->run();
return pool;
}

bind失败

在华为云服务器上bind失败,原因可能如下:
1)端口未开放
查看端口开放命令
lsof -i:80
netstat -aptn |grep -i 80 查看所有端口命令
netstat -lptn |grep -i 80 查看TCP命令
netstat -lpun |grep -i 80 查看UDP命令

2)端口已被占用

CentOS7查看核心数

grep 'core id' /proc/cpuinfo | sort -u | wc -l 华为云服务器是单核的

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment