TCP 三次握手: SYN --> SYN+ACK --> ACK
四次挥手: FIN --> ACK (FIN) --> ACK
TCP十种状态: LISTEN SYN_SENT SYN_RECV ESTABLISHED FIN_WAIT1 FIN_WAIT2 CLOSE_WAIT LAST_ACK TIME_WAIT CLOSED
MSL: 报文最大生存时间
4次握手完成连接的关闭,主动关闭连接一方在第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。
TCP服务器模型 实现的几种方式: 单进程非堵塞: 用 select.setblocking() 把套接字变成非堵塞类型.
用 select 实现 select.select() 可以用轮询的方式去询问哪些套接字有任务.(收发数据,异常)
epoll : select.epoll() 时间通知机制,效率极大提升
协程 : python 里面的协程模块 greenlet 类似于线程但不等于线程,需要用 greenlet.switch() 手动切换调用协程.
如果想自动切换,那就要用 gevent : gevent把耗时的东西(函数,类) 都重写了一遍.所以只能用它里边的东西才能实现遇到耗时操作时自动切换协程 如 gevent.socket() , gevent.sleep() , 创建协程 用 gevent.spawn() ,执行协程代码前需要加上一句 gevent.monkey.patch_all() 它会修改代码,重新编译,使得协程像线程一样可以操作.只不过是遇到耗时操作来回切换而已.