三次握手,四次挥手
1.tcp的三次握手,描述成服务端和客户端,前提条件必须服务端的TCP类型的服务启动。
第一次握手,客户端向服务端发起一次链接请求,syn=1 ,seq=x,syn请求
第二次握手,服务端接受到客户端的syn请求后,,设置seq序列号+1,ack=x,syn=y
第三次握手,客户端接受到服务端的ack 和syn后,再次发起ack=y的请求,至此tcp的双向链接完成。
数据传输: 无论任意一方,发送完数据后,接受方均返回一个ack确认接受的回复。
四次挥手:
第一,和第二次挥手:服务端的数据传输完毕,服务端主动发起断开请求的fin,seq ,客户端返回ack,seq
第二三挥手:客户端的数据传输完毕,客户端主动发起请求fin,seq,服务端返回ack,seq。
通常一次tcp的数据连接中。服务端和客户端的状态是不一样的,常见状态
服务端无法满足客户端的syn请求出现的状态或者说遭遇到syn的洪水攻击:syn_rcvd
双向链接完成处于,数据传输状态:established
服务端接受到客户端的断开fin包: close_wait
服务端等于客户端返回ack:time_wait
一般除了正常的established ,其他三种如果出现大量的状态说明服务出现异常
1.socket的地址家族 是socket.AF_INET 协议类型是TCP和UDP
2.基于TCP的socket对象,参数是指定地址家族和协议类型
3.socket的服务端创建双向链接,accept捕获数据传输。
tcp流式协议的粘包问题
11月3日总结
1.tcp协议的粘包问题,tcp协议成为流式协议,操作系统控制着数据包发送的大小和时间间隔,存在一段超大的数据发送到对端后,对端不能控制数据结束的时间点,造成上下数据包之间相互影响成为tcp的粘包。
2 解决方法
(1)客户端在发送数据之前,获取数据的长度,把长度信息使用struct.pack打包一个4个字节包发送到服务端,然后在sendall发送数据。
(2)服务端 接受数据包,进入包头循环,判断接收到的数据必须strut.unpack必须也是4个字节结束循环,把解包后的长度信息赋值一个文件长度a,再设置一个临时长度为0的b,然后进入文件接收的循环内,每接受到一个包,把数据写入文件,判断当前包的长度加入到b,当while 循环的条件 b =a 时,说明文件已全部接受完毕。
(3)通过使用包头的设置在流式协议中解决粘包的问题。
阻塞
1,阻塞的含义是在网络io 和系统io中程序保持等待的状态。
2,socket服务端存在两个阻塞的地方 第一 等待客户端进行握手链接。第二是estableshed状态接收数据。
3.解决思路是
accept获取到的connect,添加放到一个列表,依次判断每个connect是否有数据过来,有的数据
的处理数据,处理完毕后,删除列表的元素。
accept获取到一个connect,启东一个线程专门对应一个connect,数据交换完,线程回收。
深入理解内核
1.计算机是由硬件和操作系统组成,操作系统把众多的硬件的调用封装成系统的接口,提供给程序进行调用,而且是重复调用。
操作系统提供的解释器cmd,bash ,pawershell是最基础的接口调用,相比较 python解释器则时集成了相对更加高级的操作功能,其背后也是调用的系统接口。
2.进程是操作系统把文件读到内存,CPU识别二进制代码进行运算,得出的结果先存储到内存,再写入到硬盘的一个过程就是进程。
3,在通过操作系统的中断机制,可以同时运行多个进程,这个就是多进程的概念,进程是计算机分配资源的最小单位
4.进程在运行过程中需要高效的快速的得出结果,进程之下派生出N个线程进行运算,这个是高并发的概念
5.线程是cpu调度的最小单位,一个进程有N个线程,线程之间共享进程的数据。
1.并行是cpu一直为一个进程进行运算和IO,独占模式,
2.串行是cpu为进程依次进行服务,进程结束后,继续下一个。
3.以人类的观感看到cpu服务为多个进程服务,也可以称之为 并行,或者叫并发,但是本质还是串行。
4.操作系统内核进行进程调用也就是多道技术对时间的多路复用和对空间的重复利用,操作系统会把内核的函数相关的功能封装成功能接口,上层应用调用系统接口就可以操作硬件。
5.应用程序调用系统接口驱动系统内核,cpu的使用多道技术可以同时为多个进程进行服务,每一个进程中有可以加快计算速度,启动线程完成进程的功能。
6。当进程遇到网络IO和文件IO时或者进程占用cpu时间过长时,内核的调度将会快速切换到下一个进程中去服务。
7.cpu的时间切片在遇到io时,才是提高效率,进程占用时间过长切换是降低效率,所有的进程状态不一样,所以操作系统保留这种精妙的设计。
既能在各个进程中提高效率,并发起来,又能给用户的感觉是多进程并行的感觉。
8.在了解到系统的进程调度机制后,我们作为程序的设计者,软件启动后就是一个单一的进程,提高软件的效率就是减少软件io的存在,让cpu服务进程的时间内全部用于计算,在cpu被切换到其他进程时,
我们程序在进行io的工作。