当前位置: 移动技术网 > IT编程>脚本编程>Python > 网络编程协议(TCP和UDP协议,粘包问题)

网络编程协议(TCP和UDP协议,粘包问题)

2019年01月05日  | 移动技术网IT编程  | 我要评论

广西摩托大军返乡,龙飞三下江南,虎啸柔情

网络编程协议

1.osi七层模型

应用层  表示层  会话层  传输层  网络层  数据链路层  物理层

2.套接字 socket 

有两类,一种基于文件类型,一种基于网络类型

3.tcp和udp协议

tcp协议:面向连接,数据可靠,传输效率低,面向字节流

 建立连接与断开连接的过程(三次握手,四次挥手)

 建立连接:1.客户端先发出消息到服务端,请求连接

      2.服务端收到信息后,给客户端反馈一个信息,等待客户端回复

      3.客户端收到服务端的反馈信息后,再像服务端发出收到消息,连接建立

 断开连接:1.客户端先发出消息到服务端,请求断开连接

      2.服务端先发送一个信息,让客户端进行等待服务端处理通道中的数据

      3.服务端处理完通道中的数据,给客户端发送一个信息,表示已经处理完数据,等待客户端回复

      4.客户端收到消息后,给服务端发送一个回复信息,服务端收到后,断开连接

udp协议:面向无连接,数据不可靠,传输效率高,面向报文

tcp和udp协议下的socket

tcp长连接的一些问题 

  会出现粘包现象,这种现象是由缓冲区引起的

缓冲区:  将程序和网络解耦

输入缓冲区

输出缓冲区

import subprocess

    sub_obj = subprocess.popen(

        ‘dir’,

        shell=true,

        stdout=subprocess.pipe,  #正确结果的存放位置

        stderr=subprocess.pipe   #错误结果的存放位置

 )

两种粘包现象:

1 连续的小包可能会被优化算法给组合到一起进行发送

2 第一次如果发送的数据大小2000b,接收端一次性接受大小为1024b,这就导致剩下的内容会被下一次recv接收到,导致结果错乱

解决粘包的方法:

方案一:由于双方不知道对方发送数据的长度,导致接收的时候,可能接收不全,或者多接收另外一次发送的信息内容,所以在发送真实数据之前,要先发送数据的长度,接收端根据长度来接收后面的真实数据,但是双方有一个交互确认的过程

方案二:

使用struct模块,在发送前,把文件的大小打包,做成报头,把报头放在文件真实内容之前;在接收时,对发送过来的文件进行解包,然后打印文件真实内容.

打包:struct.pack(‘i’,长度)

解包:struct.unpack(‘i’,字节)

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网