TCP/UDP协议通信--Python高级

Python高级

基于UDP协议通信

特点:无连接(即不需要先建立连接),传输不可靠(丢包,乱序,但概率比较低,随着一些路由器等设备的提升,这种概率变得更低),尽力而为,通信过程和手机短信通信类似,但传输效率非常高(即通信速度很快),

使用UDP协议发送的数据包可能后发的数据包比先发的数据包先到,但概率比较低

通信实现步骤:

1.创建套接字(Socket):相当于买部手机,调用Socket,返回值是个对象

2.给套接字绑定地址:相当于给手机上号,即给自己准备的地址(IP和端口号),客户端程序可以省略这一步(采用隐式绑定)

3.通过套接字收发数据:相当于通过手机收发短信

4.关闭套接字,相当于关闭手机

 

基于TCP协议通信

特点:面向连接,传输可靠(差错校验,重传,拥塞控制,失序处理),通信过程和用手机打电话类似,但传输效率低(即通信速度慢),

为什么可靠:有校验数据的功能(即差错校验),校验时如果与你发过来的不一样,会要求你重传,拥塞控制,失序处理,当数据包进行切割,当后面的数据包先到时会让其在缓冲区等待,等前面的数据包都到达了再一起交给进程

 

TCP的客户端和服务器是不对等的

 

TCP服务器(相当于接电话的人)的实现步骤:

1.创建(监听)套接字,相当于买部手机

2.给套接字绑定地址,相当于给手机上号

3.将套接字设置为监听状态,相当于把手机设置为待机状态

4.接受客户端连接请求(返回一个对应的连接套接字),相当于接受其他人的来电请求

5.收发数据,相当于互相通话

6.通信结束关闭套接字(即断开连接),相当于通话结束挂机

7.关闭监听套接字,相当于关机

 

TCP客户端(相当于打电话的人)的实现步骤:

1.创建套件字,相当于买部手机

2.给手机绑定地址,可以省略这一步(隐式绑定),相当于给手机上号

3.连接服务器,相当于拨打其它人电话

4.收发数据,相当于互相通话

5.关闭套接字,即断开连接吗,相当于挂断电话

 

基于UDP协议通信的特点

以数据包为单位进行收发的,即每次调用send或sendto就会发出一个数据包(建议单词发送的数据不要超过548字节), 每次调用recvfrom就会接收一个数据包,如果一个只接收了数据包中的一部分份数据,剩下的数据将会丢失

UDP协议内没有提供流量控制功能,当发送方发送了很多数据包,而接收方没有接收处理,就会导致网络接收缓冲区满了,无法再容纳接收的数据包,从而导致丢包

 

基于TCP协议通信的特点

流式传输, 存在粘包现象,内部具有流量控制和差错校验功能,当接收方没有及时接收处理数据导致网络接收缓冲区满了,TCP协议内部会通知发送方,让其暂停继续发送数据,即send会阻塞调用线程, 当接收方的网络接收缓冲区有空闲空间了就会自动恢复发送操作

 

send函数就是将我们要发送的数据放到网络发送缓冲区中而已,所以不要通过它的成功执行判断对方成功接收到数据,要想准确判断对方成功接收到我们发送的数据,最好是让接收方接收到数据后给发送发回复一个确认消息

 

粘包现象产生的原因:

1.TCP协议内部的默认优化机制,在我们调用send发送一份数据时,其实TCP协议并不会立即将这份数据打包发送到网络上去,只是将这份数据放到网络发送缓冲区中排队等候发送,并且会等待一小段时间,如果在等待期间又调用send发送数据,它同样会继续将这份数据放到网络发送缓冲中排队等候处理,如果在等待期间没有调用send发送数据,它就会将网络发送缓冲区中的所有数据打包发送

2.如果接受方没有及时接收处理数据,发送过来的多个数据包将会在网络接收缓冲区中粘连在一起, 无法区分出不同数据包的界限

 

粘包问题解决方法:

1.取消TCP协议内部的优化机制,不建议采用,很弱智

2.增加调用send函数的时间间隔,不建议采用,很弱智

3.应答式通信,

4.给发送的数据前面加上包头(表示待发送数据的描述信息, 比如数据的长度,哈希值,名称等)

 

文件传输通信协议(命名azhe协议)设计:

1.基于TCP协议

2.客户端连接服务器成功后,客户端不发送任何消息,服务器端首先将一个文件的描述信息(定长包头,长度为247B)发送给客户端,紧接着发送文件数据给客户端,发完文件数据后断开连接

3.文件描述信息结构为:文件名(200B,不足则在右边填充空格,UTF-8编码) + 文件大小(15B,不足则在右边填充空格) + 文件MD5值(32B,大写形式)

 

 

UDP数据包最好控制548字节以内就不会拆包

TCP粘包现象,tcp不会一个包一个包的发送,收到包后会等待,短时间内如果再接收到包,就会将它们粘在一起然后一起发送

 

 

扩展

1.TCP协议不支持广播,它是点对点的

2.在同台机器上TCP和UDP的端口号可以相同,但相同协议使用相同端口肯定会有问题

3.看到电线不要只以为是电线,其实是电力网络

4.网络通信编程也称为socket编程

5.手机号就是这部手机在移动无限网中的地址

6.地址不仅仅是IP地址,其实包括IP地址和端口号

7.传输层打包 ,原端口号和目标端口号

网络层打包,原IP和目标IP

 

 

posted @ 2019-08-05 20:42  YruiZ  阅读(331)  评论(0编辑  收藏  举报