python服务器高并发编程

python服务器高并发编程

1.socket相关概念

注意:请别关注图从哪里来,我只是想把知识点讲清楚

  • 进程与进程通信的方式
  • [ ] 管道(无名、高级、有名)
  • [ ] 消息队列(message queue)
  • [ ] 信号量
  • [ ] 信号
  • [ ] 共享内存
  • [ ] 套接字

注意:本篇只讨论socket通信,其他进程间的方式不去论述,罗列的原因是为了说明socket本质就是为了解决进程间的通信问题,尤其是网络上两个进程通信的问题。

  • socket地址 = ip地址 + 端口号
ip地址:唯一定位一个网络主机
端口号:唯一映射一个需要网络服务的进程

socket地址解决了两个进程通信时如何相互定位的问题。具体通信时,数据怎么传输,传输多少,那就是Tcp/ip协议的相关内容了!

这里简单的描述一下TCP和UDP

上个图:网络中,不同的层解决不同的问题,因而每一层有个头,上层消息被包裹在下层消息体中,其中进程间通信的socket数据包被包裹在ip包中。


python服务器高并发编程_第1张图片
image

python服务器高并发编程_第2张图片
image
  • [ ] 1.在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum
  • [ ] Transmission Unit)为1500;
  • [ ] 2.在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;
  • [ ] 3.在传输层:每次传输的数据包受到IP包长度的限制,每个数据包连头部不能超过IP报的MTU
UDP包是将所有的数据放在一个IP包中传输,而UDP包的首部要占用8字节,所以UTP的MTU为1480-8=1472;

TCP则先通过一定的交互建立连接,然后将数据切片发送--具体里面的协议就不讲了!

Tcp数据包的图:TCP连接一旦建立,则开始分片发送数据


python服务器高并发编程_第3张图片
image
  • 啰嗦一下TCP三次握手,四次挥手
    首先上图:
python服务器高并发编程_第4张图片
image

问题1:为什么要进行第三次握手

第一次握手,客户端和服务器一发一答代表双方活着,可以发送数据。

而,客户端再发一次应答的原因:主要是为了防止已失效的连接请求报文段又突然传送给B,从而产生了错误。
问题2:为什么要进行四次挥手
过程:

第一次挥手:主机1向主机2,发送FIN报文段,表示关闭数据传送,并主机1进入FIN_WAIT_1状态,表示没有数据要传输了 
第二次挥手:主机2收到FIN报文段后进入CLOSE_WAIT状态(被动关闭),然后发送ACK确认,表示同意你关闭请求了,主机到主机的数据链路关闭,主机进入FIN_WAIT_2状态 
第三次挥手:主机2等待主机1发送完数据,发送FIN到主机1请求关闭,主机2进入LAST_ACK状态 
第四次挥手:主机1收到主机2发送的FIN后,回复ACK确认到主机2,主机1进入TIME_WAIT状态。主机2收到主机1的ACK后就关闭连接了,状态为CLOSED。主机1等待2MSL,仍然没有收到主机2的回复,说明主机2已经正常关闭了,主机1关闭连接。

为什么:
我告诉你的原因是为了保证TCP的稳健性,具体的情况很多,我也说不清楚!


待续……

2.select相关原理

3.poll原理

4.epoll原理

你可能感兴趣的:(python服务器高并发编程)