为什么TCP比UDP可靠真正原因,以及并发编程的基础问题
一 为什么TCP协议比UDP协议传输数据可靠:
我们知道在传输数据的时候,数据是先存在操作系统的缓存中,然后发送给客户端,在客户端也是要经过客户端的操作系统的,因为这个过程涉及到计算机硬件,也就是物理层的一些东西,那么tcp协议在确认客户端接收到完整的信息之后才会删除服务端操作系统中的缓存,否则就会继续发,这才是TCP协议的可靠性根本原因,而UDP只管发送数据而不管客户端有没有收到,所以就会造成丢包现象。
二 基于套节子的编程:
基于TCP协议的套接字(无并发):
服务端:
import socket
sever=socket.socket(socket.AF_INET,socket.)
sever.blind(ip)
sever.listen(5)
sever.accept()#这个时候客户端没有发消息,服务端就会停在这
while True:
conn,client_addr=sever.accept()
print(client_addr)
while True:
try:
data=conn.recv(1024)
##if not data:break##linux系统上使用
conn.send(data.upper())
except ConnectionResetError
break
conn.close()
sever.close() 客户端:
import socket
client=socket.socket(socket.AF_INET,socket.SOCK.STREAM)
client.connect(ip)
while True:
msg=input('input:').strip()
if not msg:continue
client.send(msg.encode('utf-8'))
data=client.recv(1024)
这种情况下并没有并发效果,可以通过几个客户端连接到同一个服务端,所有的请求首先送到服务端半连接池,服务端再到伴了连接池取,
取出之后开始为第一个客户端服务,只要客户端不结束,那么就一直为客户端服务,不能为其他的客户端服务,其他的可以建成连接,但是没办法交互,
访问数量超过伴连接池规定,就会报错,伴连接池。
解决访问数量超过伴连接池报错问题:
import socket
client=socket.socket(socket.AF_INET,socket.SOCK.STREAM)
client.connect(ip)
while True:
msg=input('input:').strip()
if not msg:continue
client.send(msg.encode('utf-8'))
data=client.recv(1024) 解决进不去半连接池问题:也就是没办法发请求,一个连接,五个等待。
在第一个人没有结束的时候,那么伴连接池的人都进不去, while True:
try:
client=socket.socket()
client.connect((ip))
break
except ExceptionError
time.sleep(3)
print('等待3秒')
三 基于UDP协议的套接字:
TCP:流逝协议
UDP:数据报协议
服务端:
import socket
sever=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sever.bind((ip))
while True:
client_data,client_addr=sever.recvfrom(1024)
sever.sendto(client_data.upper(),client_addr)
print(res) 客户端:
import socket
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True:
msg=input(':')
client.sendto((ip))
sever_data,sever_addr=client.recvfrom(1024)
print(sever_data,sever_addr) UDP:可以在不开启服务端的情况下,发消息,调用的为SOCK_DGRAM。
1 UDP的特征:
数据报协议,自带报头,完整的数据报,所以UDP没有粘包现象,发与收一一对应,这一点与TCP是不一样的,
UDP来发消息,稳定可靠的数据量就是512kb,所以我们定义一个1024就够了。超过这个数就会容易造成丢包的现象,所以UDP一般用于数据量比较小的场景,比如我们平时聊天信息等。
四 并发编程:
理论知识
并发指的是服务端,需要同时处理多个进程。
进程:正在执行的过程或者正在执行的程序。
程序:说白了就是一堆文件。
运行一个程序就是起了一个进程,进程是一个抽象的概念进程的概念。
二 进程与程序的区别
程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。
举例: 比如我们要做饭,那么我们首先要有食材,食谱,同样还要有厨师。 在这个比喻中: 做蛋糕的食谱就是程序(即用适当形式描述的算法) 计算机科学家就是处理器(cpu) 而做饭各种原料就是输入数据。 进程就是厨师阅读食谱、取来各种原料以及烘制蛋糕等一系列动作的总和。 需要强调的是:同一个程序执行两次,那也是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播放苍老师,一个可以播放波老师。
进程起源于操作系统,
2 操作系统:用于协调,管理,控制计算机硬件与软件的资源的一种控制程序
作用1:把复杂丑陋的硬件操作都封装成美丽的借口,提供给应用程序,
作用2:把进程(应用程序)对硬件的竞争变得有序,
3 计算机发展史:
1 第一个阶段:真空管和穿孔卡片
特点:
没有操作系统的概念
所有的程序设计都是直接操控硬件 工作过程:
程序员在墙上的机时表预约一段时间,然后程序员拿着他的插件版到机房里,将自己的插件板街道计算机里,这几个小时内他独享整个计算机资源,后面的一批人都得等着(两万多个真空管经常会有被烧坏的情况出现)。 后来出现了穿孔卡片,可以将程序写在卡片上,然后读入机而不用插件板 优点: 程序员在申请的时间段内独享整个资源,可以即时地调试自己的程序(有bug可以立刻处理) 缺点: 浪费计算机资源,一个时间段内只有一个人用。
注意:同一时刻只有一个程序在内存中,被cpu调用执行,比方说10个程序的执行,是串行的
第一代计算机
2 第二阶段:晶体管和批处理系统
第二代计算机的产生背景: 由于当时的计算机非常昂贵,自认很自然的想办法较少机时的浪费。通常采用的方法就是批处理系统。 特点:
设计人员、生产人员、操作人员、程序人员和维护人员直接有了明确的分工,计算机被锁在专用空调房间中,由专业操作人员运行,这便是‘大型机’。 有了操作系统的概念 有了程序设计语言:FORTRAN语言或汇编语言,写到纸上,然后穿孔打成卡片,再讲卡片盒带到输入室,交给操作员,然后喝着咖啡等待输出接口 第二代如何解决第一代的问题/缺点:
1.把一堆人的输入攒成一大波输入,
2.然后顺序计算(这是有问题的,但是第二代计算也没有解决)
3.把一堆人的输出攒成一大波输出 现代操作系统的前身:(见图) 优点:批处理,节省了机时 缺点:
1.整个流程需要人参与控制,将磁带搬来搬去(中间俩小人) 2.计算的过程仍然是顺序计算-》串行 3.程序员原来独享一段时间的计算机,现在必须被统一规划到一批作业中,等待结果和重新调试的过程都需要等同批次的其他程序都运作完才可以(这极大的影响了程序的开发效率,无法及时调试程序)
第二代计算机
3第三阶段:集成电路芯片和多道程序设计
第三代计算机基本上解决了前两代计算机的一些缺点,比如串行等问题。
第三代计算机的操作系统广泛应用了第二代计算机的操作系统没有的关键技术:多道技术
cpu在执行一个任务的过程中,若需要操作硬盘,则发送操作硬盘的指令,指令一旦发出,硬盘上的机械手臂滑动读取数据到内存中,这一段时间,cpu需要等待,
时间可能很短,但对于cpu来说已经很长很长,长到可以让cpu做很多其他的任务,如果我们让cpu在这段时间内切换到去做其他的任务,这样cpu不就充分利用了吗。
这正是多道技术产生的技术背景
五 多道技术:
是想要在单个cpu的情况下,实现多个进程并发执行的效果。
多道技术:空间上的复用(多道程序重用一个内存空间)
时间上的复用:(多道程序复用CPU时间)
1 时间上的复用的问题:1 CPU遇到io操作要切换(提升效率)
2 一个进程占用CPU时间过长也要切,操作系统来切换(降低效率)
1.时间上的复用 当一个资源在时间上复用时,不同的程序或用户轮流使用它,第一个程序获取该资源使用结束后,在轮到第二个。。。第三个。。。 例如:只有一个cpu,多个程序需要在该cpu上运行,操作系统先把cpu分给第一个程序,在这个程序运行的足够长的时间(时间长短由操作系统的算法说了算)
或者遇到了I/O阻塞,操作系统则把cpu分配给下一个程序,以此类推,直到第一个程序重新被分配到了cpu然后再次运行,由于cpu的切换速度很快,
给用户的感觉就是这些程序是同时运行的,或者说是并发的,或者说是伪并行的。至于资源如何实现时间复用,或者说谁应该是下一个要运行的程序,
以及一个任务需要运行多长时间,这些都是操作系统的工作。 2.空间上的复用 每个客户都获取了一个大的资源中的一小部分资源,从而减少了排队等待资源的时间。 例如:多个运行的程序同时进入内存,硬件层面提供保护机制来确保各自的内存是分割开的,且由操作系统控制,这比一个程序独占内存一个一个排队进入内存效率要高的多。 有关空间复用的其他资源还有磁盘,在许多系统中,一个磁盘同时为许多用户保存文件。分配磁盘空间并且记录谁正在使用哪个磁盘块是操作系统资源管理的典型任务。 这两种方式合起来便是多道技术
2 空间复用问题:
但是有一个很关键的问题就是,多个进程共享内存空间,但是多个进程之间的内存空间必须是互相隔离的,否则会造成一系列问题:
程序之间的内存必须分割,这种分割需要在硬件层面实现,由操作系统控制。如果内存彼此不分割,则一个程序可以访问另外一个程序的内存, 首先丧失的是安全性,比如你的qq程序可以访问操作系统的内存,这意味着你的qq可以拿到操作系统的所有权限。 其次丧失的是稳定性,某个程序崩溃时有可能把别的程序的内存也给回收了,比方说把操作系统的内存给回收了,则操作系统崩溃。
3 分时操作系统:
多个联机终端+多道技术
其实第三代计算机采用的依然是批量处理模式,那么为了昂所有的用户觉得自己在独享服务器啊恩么做呢:一个计算机,一个cpu,每个客户端都可以连接到服务端,然后每个客户端在服务端都有一个进程,那么客户端的电脑想要运行程序首先把程序传输到服务端,然后服务端把运行结果返给客户端。这个时候就用到了多道技术,在多个进程之间切换。
把20个客户端同时加载到服务端的内存,那么这20个客户端一般不会同时运行,一部分在进行IO,一部分在进行,就绪状态,
那么CPU就可以采用多道的方式来处里个别的正在运行的程序,20个客户端同时加载到内存,有17在思考,3个在运行,cpu就采用多道的方式处理内存中的这3个程序,
由于客户提交的一般都是简短的指令而且很少有耗时长的,索引计算机能够为许多用户提供快速的交互式服务,所有的用户都以为自己独享了计算机资源。
为什么TCP比UDP可靠真正原因,以及并发编程的基础问题的更多相关文章
- UDP可靠传输那些事
有空来论坛走走,发现讨论udp可靠传输又热了起来,有人认为udp高效率,有人认为udp丢包重传机制容易控制,还有朋友搞极限测试,当然也有人推销自己的东西,这里写一点我个人的看法. udp可靠传输其实非 ...
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- TCP和UDP的9个区别是什么
TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题.我曾经在 ...
- TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释
一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...
- TCP、UDP、RTP(RTCP)异同与区别
OSI七层模型OSI 中的层 功能 TCP/IP协议族 应 用层 ...
- TCP与UDP协议
传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...
- TCP和UDP之间的区别
TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供超时重发,丢弃重复数据,检验数据,流量控制等 ...
- [转载] TCP与UDP对比
TCP和UDP区别 TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠的 不可靠的 应用场合 传输大量的数据 少量数据 速度 慢 快 OSI 和 TCP/IP 模型在传输 ...
- 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题
重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...
随机推荐
- spring中afterPropertiesSet方法与init-method配置描述
1. InitializingBean.afterPropertiesSet()Spring中InitializingBean接口类为bean提供了定义初始化方法的方式,它仅仅包含一个方法:after ...
- a标签打开设置
<a href="http://www.baidu.com" target="_Blank">百度</a> _Blank是新窗口_Sel ...
- monkey配置及简单报告生成(安卓)
参考网址:http://www.51testing.com/html/72/502872-3709760.html 1.安装jdk,配置环境变量 2.安装sdk(解压后,配置环境变量到path ...
- 自然语言处理hanlp的入门基础
此文整理的基础是建立在hanlp较早版本的基础上的,虽然hanlp的最新1.7版本已经发布,但对于入门来说差别不大!分享一篇比较早的“旧文”给需要的朋友! 安装HanLP HanLP将数据与程序分 ...
- Druid + Grafana 应用实践
谈到大数据,大家首先想到的肯定是Hadoop,近年来互联网技术的快速增长催生了各类大体量数据的爆发,Hadoop最大的贡献在于帮助企业将那些低价值的事件流数据转化为高价值的聚合数据,为企业的经营决策提 ...
- 【java_需阅读】Java中static关键字用法总结
1. 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法. · 它 ...
- ionic 监听页面滚动,点击停止滚动
类似今日头条,页面上有很多card,点击每个card跳转该card的详情页面.这里有一个问题,当我滚动页面时,会先后触发touchstart.touchmove.touchend,但是当touchen ...
- Python进行RSA安装加密
一.下载ez_setup.py(http://peak.telecommunity.com/dist/ez_setup.py) 二.用python解释执行它 (如使用IDLE打开该py文件,按F5解释 ...
- js的命名空间 && 单体模式 && 变量深拷贝和浅拷贝 && 页面弹窗设计
说在前面:这是我近期开发或者看书遇到的一些点,觉得还是蛮重要的. 一.为你的 JavaScript 对象提供命名空间 <!DOCTYPE html> <html> <he ...
- C++进阶--命名空间和关键字using
//############################################################################ /* * C++关键字:using * * ...