一、TCP套接字

  1、low版tcp套接字

      服务器端                              客户端

    

  2、改进版tcp套接字

          服务端                        客户端

   

二、UDP的套接字

        服务器                        客户端

  

    注:udp的套接字可以支持多个客户端同时访问,但tcp套接字就不行了,那是因为tcp套接字有tcp三次握手四次挥手。

三、recv和recvfrom的区别?

  1、提前须知:

    1.1tcp是send发送消息,recv接收消息。

    1.2udp是sendto发送消息,recvfrom接收消息。

    1.3 在我眼里看来send只是发送一个数据对象,所以recv接收的也只是一个数据对象,而sendto发送的是个数据对象和ip端口两个信   息,所以接收的也应该是个数据对象和ip端口信息。

  2、tcp是基于数据流工作的,而udp是基于数据报工作的。

    2.1send(bytes_data)发送数据流时当数据流的数据为空那么发送到自己的socket缓存区时,操作系统会把空包发过去。

    2.2sendto(bytes_data,ip_port):发送数据报时,数据报中的数据为空但是ip和端口是不会为空的,发送到自己的缓存区后操作系统就会  对该数据进行处理

  3、recv和recvfrom

    3.1在tcp协议中如果服务器端接收缓冲区的数据为空,那么recv就会处于阻塞或者等待状态,这样客户端就一直没有返回的结果了。

    3.2tcp协议基于链接通信:

       基于链接通信就必须指定半连接池的大小——listen()

       基于链接必须先运行服务器端服务然后再运行客户端服务

       基于链接如果一端断开那么另一端也会跟着断开,所以要么在服务器端异常处理,要么设置if判断

    3.3在udp协议中如果服务器端接收缓冲区的数据为空,那么recvfrom也会阻塞,但是只不过dup协议的客户端sendto一个空数据并不是真的空数据,还有地址信息,所以服务器端也可以recvfrom到数据。

    3.4udp协议是无连接通信:

        所以不需要指定什么连接池的,也不需要服务器端运行了才能发送数据

三、粘包

  1、粘包须知:只有tcp协议才会出现粘包,udp协议是不会粘包的。

  2、什么是粘包?

    2.1如图所示:

      

    2.2无论是在服务端还是在客户端程序都是存在于用户态的,程序要想接受或者是发送数据都必须把数据交给操作系统,由操作系统来  控制底层硬件,从而达到发送数据和接受数据。而把数据是怎么交到操作系统手里的呢,首先程序会把数据发送到他的缓存空间里面,默认  大小是8K,然后操作系统来读取他的这个缓存空间中的数据从而进行转发。读分为两种情况,当缓存中的内存在规定的时间内占满了那么操  作系统就会读取缓存中的内容,还有一种情况就是当缓存中的数据超过规定的时间那么操作系统也会读取缓存中的数据进行转发。

    2.3无论是服务端还是客户端的发送或者是接收的大小都可以自己定义,因为对于tcp协议的应用程序来说他们看到的只是个整体或者说  是个流,一条消息有多少个自己他们是看不到的,所以说tcp协议是面向于流的协议,所以在接收一个数据时tcp不知道该数据到底要接收多  少个字节,然后就出现了粘包现象。

    2.4tcp协议是面向消息的协议,每一个udp段都是一段数据,或者说是一段消息,应用程序必须以这段消息为单位来提取这段数据,不  能一次性提取任意字节的数据,这一点和tcp协议很不相同,所以说udp协议是不会出现粘包现象的。

    2.5因此在tcp协议中所谓的粘包现象无非就是好接收者不知道到底该接收多少个字节的数据而已。

  3、小结:

    3.1:udp协议的recvfrom()是阻塞的,一个recvfrom(x)必须对一个sendto(y)收完了才算完成传输,如果x>y就会出现丢包现象。

    3.2:tcp协议数据不会丢失没有收完包,下次连接会基于上次连接再进行传输。传输端接收到ack时才会清空缓冲区的内容。

  4、两种清空下产生粘包现象

    4.1::当发送者的缓存区在规定的时间内满了后发送数据会产生粘包现象。

    4.2:客户端在规定的时间内在缓冲区没有完全的接收到发送者发来的包,只接受到了一部分包,那么下一次接收时就会产生粘包现  象。

  5、应当注意的一些问题。

    5.1当发送到发送的数据包大于网卡规定MTU的大小时,这时网卡会把该数据包分成几个小数据包发送出去,只要接收端依次接收就可  以了。  

    5.2send的字节流先发送到自己的缓存区(该缓存区可能还缓存的有其他数据),那么当需要缓存的数据大小大于剩余缓存区的空间这样就会数据丢失,所以用sendall就会循环发送需要缓存的数据,解决了数据丢失问题。

四、粘包解决办法。

   1、low版解决方案

    服务器端                        客户端

  

  注释:为什么说他low呢?是因为会send一个接收字节的长度给接收端,这样大大提高了带宽延迟,降低了代码执行效率。

  2、高级版解决方案

    服务端                              客户端

   注:服务端内容是没有变化的只是在客户端内容发生了变化。

  

python基础22------python基础之基于tcp和udp的套接字的更多相关文章

  1. 网络编程之基于tcp和udp的套接字

    一   udp协议网络编程 DNS:将域名解析成ip地址 SOCK_DGRAM:数据报协议,也是udp协议 udp协议的网络编程的一些用法: recvfrom:接收消息,接收的时一个元组,元组里面的元 ...

  2. day34 基于TCP和UDP的套接字方法 粘包问题 丢包问题

    TCP 基于流的协议 又叫可靠性传输协议 通过三次握手 四次挥手 来保证数据传输完毕 缺点效率低 正因为是基于流的协议 所以会出现粘包问题粘包问题:原因一:是应为数据是先发送给操作系统,在操作系统中有 ...

  3. Learning-Python【28】:基于TCP协议通信的套接字

    什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Sock ...

  4. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...

  5. 基于TCP连接的socket套接字编程

    基于TCP协议的套接字编程(简单) 服务端 import socket server = socket.socket() server.bind( ('127.0.0.1', 9999) ) serv ...

  6. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  7. python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议

    socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...

  8. 基于TCP与UDP协议的socket通信

    基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...

  9. 网络基础之网络协议篇---CS架构--网络通信--osi 协议---套接字socket--粘包

    1 C\S 客户端/服务器架构: .硬件 C/S架构 (打印机) .软件 C/S 架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...

随机推荐

  1. Yii2数据库分页操作方法介绍

    本章节将介绍怎样怎样创建一个从数据表 country 中获取国家数据并显示出来的页面. 为了实现这个目标,你将会配置一个数据库连接.创建一个活动记录类,而且创建一个操作及一个视图. 贯穿整个章节,你将 ...

  2. react-native 常用组件的用法(一)

    1.View组件 View是一个支持Flexbox布局.样式.一些触摸处理.和一些无障碍功能的容器,并且它可以放到其它的视图里,也可以有任意多个任意类型的子视图. View的设计初衷是和StyleSh ...

  3. javascript洗牌算法 乱序算法 面试题

    1.2种方案代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset=" ...

  4. swift 中的问号跟感叹号

    ?: 变量在使用过程中可能存在空值,则需要用?标记,否则赋空值会报错 ? 1 2 var mustNoNilValue: String = "Swift" var canNilVa ...

  5. Httpclient 实现带参文件上传

    这里直接贴出的是我封装好的doPostFile方法,httpclient 的版本是3.1. public static String doPostFile(String url, Part[] par ...

  6. 在Eclipse中使用JUnit4进行单元测试(初级篇、中级篇、高级篇)

    本文转载自以下 初级篇: http://blog.csdn.net/andycpp/article/details/1327147 中级篇: http://blog.csdn.net/andycpp/ ...

  7. Codeforces 14D Two Paths 树的直径

    题目链接:点击打开链接 题意:给定一棵树 找2条点不反复的路径,使得两路径的长度乘积最大 思路: 1.为了保证点不反复,在图中删去一条边,枚举这条删边 2.这样得到了2个树,在各自的树中找最长链.即树 ...

  8. wamp 两个不同的php.ini

    最近在本地开发的windows wamp环境安装一个vld 扩展,碰见一个奇怪的问题,phpinfo() 有 而cli 命令模式里面却没有 最后发现wamp phpinfo()和cli命令模式指向的p ...

  9. 利用socket.io实现消息实时推送

    最近在写的项目中存在着社交模块,需要实现这样的一个功能:当发生了用户被点赞.评论.关注等操作时,需要由服务器向用户实时地推送一条消息.最终完成的项目地址为:socket-message-push,这里 ...

  10. android 二维码制作,显示到UI,并保存SD卡,拿来就能用!!

    转载请注明出处:王亟亟的大牛之路 如今二维码已经渗透了我们的生活.各种扫码关注啊.扫码下载的,今天上一个依据输入内容生成二维码的功能. 包结构: 界面截图: 功能:输入网址–>生成图片–> ...