Python之网络编程二
一:TCP协议和UDP的协议
基于tcp通信必须先三次握手建立通路。
没有发数据之前:
1.c向s发送信息,老铁我要连接你的服务器,建立一个通路,第一次握手。
2.s收到c的信息,好的收到你的信息此时c到s通路建立,那么我也要和你建立通路,第二次握手,s向c发了确认信息和请求信息合并发送。
3.c收到s的请求信息和确认信息,收到确认信息之后不再发请求了,然后发个消息告诉s好的我同意你建立通路,第三次握手完成。
结果:双向通路建立了,应用层开始发送信息,服务器端相应信息回客户端。
四次挥手:
双方都可以先发起断开请求
1.客户端发出断开请求的场景多,一条请求断开信息法到服务器,s收到,第一次挥手。
2.客户端收到断开请求后,发送消息同意了第二次挥手,那么c-->s通路断开,c不能再给s发信息了。
3.但是服务端的数据很可能没有处理完,数据处理完之后发给C告诉它,你的数据发完了,断开连接吧第三次挥手。
4.收到服务端从s---->c通道传来的数据,和断开的请求,c把同意的信号发送给s端,至此第四次挥手。
二:目的
上面理论基本都可以简单说出来。
但是建立TCP连接的目的是什么,不建立不行么?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误
首先(严肃脸),所谓的建立连接并不是,像电话那样插根线的单纯理解
计算机网络的连接只是双方在自己的计算机为对方开辟了专门的内存,cpu处理时间等资源,双方都会为了对方维持一种状态,来告诉os有一个连接,网络中根本没有那么一条线。
数据从内存经过os经过物理设备,传输到另一个os中,然后到另一个os的内存中。
TCP之所以说是可靠链接,是因为双方都分配了资源记录的对方发过来几份数据,少了重传,然后按照序号排列得到正确的数据。
一份信息可能分10个数据包发送,对方只收到了9个,哪个没收到都在内存当中记录,然后告诉发送方重发一份,发送方从自己内存中找到没法的一个数据包重传。
因此TCP是可靠的,可靠是建立在双方都为稳定的数据传送付出了资源,就像等待客人到来,收拾屋子准备糕点一样。
三:服务器连接数限制
1.一个连接的建立就要耗费一定的资源,物理资源有限,因此连接数有一个最大的限制。
2. 连接数打满了,再高带宽带着数据也进不来,app拿不到数据,图片都无法加载
3. 连接数没满,那么系统资源足够,带宽携带的数据充分高效的被搬运到各个app下,各个app正常运行。
所以tcp建立双向链接是占用资源的,每个时刻os都会受到从不同方向传过来的数据,分别属于不同的进程,
三次握手是为了更好的分配资源,防止不必要的开销。
带宽是指在单位时间(一般指的是1秒钟)内能传输的数据量。网络和高速公路类似,带宽越大,就类似高速公路的车道越多,其通行能力越强。网络带宽作为衡量网络特征的一个重要指标,日益受到人们的普遍关注。它不仅是政府或单位制订网络通信发展策略的重要依据,也是互联网用户和单位选择互联网接入服务商的主要因素之一。
带宽就像这个时间点来了10t的货物,连接数是搬运的所有人数,不同的port有不同数目的搬运工人,10t货物分数不同的app,连接数都被别人占着,或者远远没有达到你的最低标准连接数
那么你的app搬运数据的能力很低,例如打开淘宝,死活刷不出来来图片,
服务器同时最大连接数假如1000,同一时刻有1000人可以访问服务器,1001人访问不了
数据库连接数突然增大?
可能是数据库性能突然变慢,已经连接的客户要很久才能得到响应,客户以为是自己没确认到,于是客户就不断地连接,这样会话就增加了,数据库就更忙了,最后可能会挂了
四:需求服务攻击
因为tcp是好人协议,服务端不拒绝,模拟大量的tcp请求,发过去之后客户端就没了,服务端给假的客户端回消息,尽管不会一直回,但是这段时间一直占用系统资源
同时来很多请求连接,操作系统不可能一下全部建立,而是维护一个队列,os从队列取然后一个个回