Java网络编程之TCP协议核心机制(二)

目录

题外话

正题

滑动窗口机制

如果出现丢包问题怎么办??

滑动窗口触发条件

流量控制

拥塞控制

小结


题外话

宿舍没有空调的感觉谁懂?!!!

人要蒸发了,八点自动热醒,直接强行学习

正题

我们继续讲解TCP协议核心机制

上篇博客讲完了,建立连接机制,确认应答机制,超时重传机制,接着往下书写

滑动窗口机制

由于确认应答机制,每次从客户端向服务器发送数据,服务器都会返回一个ACK(同步确认包)

如下图

我们可以看到,每次客户端发送数据到服务器,都要等待服务器返回ACK数据包才会再发送数据

如果数据包比较多,发送次数就会变得更高,而且会影响效率

当我们触发滑动窗口,就会把一条一条的数据发送转换成批量发送并且批量等待ACK

当客户端收到一个ACK数据包的时候,客户端就会往后继续发送数据包,比如客户端收到了服务器发来的1001序列号的ACK数据包,然后就会发送3001-4000这个数据包

如下图

这样就可以在同一时间发送多个数据包,从而使效率提升

如果出现丢包问题怎么办??

滑动窗口机制是一定要保证可靠性的

下面有两种丢包情况

1.客户端发送数据包抵达,但ACK数据包丢包

如果ACK数据包丢包,不会做任何处理

比如序列号1001和2001的ACK数据包全部丢失,但是3001ACK数据包没有丢失,成功发送到客户端,这就意味着客户端已经知道服务器接收到了0-1000,1001-2000的数据包

如下图

2.客服端发送数据包丢包

如果客户端发送序列号为0-1000数据包时发生丢包,服务器会不断发送序列号为1001的ACK,当客户端收到若干次相同序列号ACK,客户端则会重新发送丢包的数据包,并且之前客户端继续发送过来的数据包服务器也会正常接收

如下图

针对上述出现的丢包问题,整个处理过程是很高效的,这叫快速重传和超时重传不同

1.对于ACK丢失,不做任何处理

2.对于数据包丢失,只需要把缺失部分数据重传即可,不需要重传其它数据

滑动窗口触发条件

如果TCP传输数据比较少,不频繁,就不会触发滑动窗口

如果短时间传输大量的数据,此时才会触发滑动窗口

流量控制

在服务器会有一个接收缓冲区(阻塞队列)

服务器发送的ACK数据包中会在tcp报头中指定一个字段,表示未使用空间大小

客户端会根据接收缓冲区中的未使用空间的大小进行数据传输控制

如下图

客户端发送的数据包会被应用程序消耗

客户端会周期性发送一个"窗口探测报文",主要是为了触发服务器发送ACK

从而知道接收缓冲区空间情况

接收缓冲区大小在TCP中是可以扩容的,接收缓冲区中的未使用空间越多,也就意味着传输的数据可以更多

拥塞控制

拥塞控制和流量控制都是为了搭配滑动窗口机制而产生的

如上图,当我们要将大量数据包从A设备发送到B设备,中间可能会经过好几个节点

如果中间任何一个节点出现丢包都会影响整体数据传输效率

TCP会将它们都看做一个整体

通过"实验"的方式去找到一个合适的窗口大小从而提升数据传输效率

窗口具体变动如下图

由图可见窗口时刻处于一个动态变化

小结

本篇博客讲解了滑动窗口机制,流量控制机制,拥塞控制机制

喜欢的家人们麻烦给个三连(点赞关注收藏!!!)

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Java的视频会议系统(软件程序+WORD论文文档) 2.1.1 技术可行性 网络视频会议是顺应市场的需求而设计的。采用JAVA 编程语言,用eclipse开发平台实现。用到多媒体技术(JAVA 多媒体框架JMF),视频和音频用TRP协议传输,用到Socket编程技术,多播技术。网络视频会议首先是基于网络传输的,那么就必然要依托于JAVA网络编程的相关知识。在这基础上,由于相关音频、视频,所以还要涉及到JAVA的多媒体技术的相关知识,即JMF (Java Media Framework)。利用JAVA的这个组件,我们可以方便的处理多媒体文件,并基于RTP协议进行实时传输。 2.1.2 操作可行性 系统运行于Windows环境,其用户操作界面友好,便于操作,适合视频会议流程。 系统的基本操作如下: 1.启动服务器; 2.用户连接到服务器; 3.进行视频连接; 4.举行会议; 5.会议完毕,退出系统。 2.2 采用的关键技术介绍 2.2.1 JAVA多媒体技术 JAVA多媒体技术的核心Java媒体框架 JMF(Java Media Framework)。JMF中包含了许多用于处理多媒体的API,它是一个很好的多媒体编程工具,同时也是一个相当复杂的系统。JMF的主要应用功能之一是多媒体数据流在网络中的实时传输,其RTP包中提供的RTP包中提供的RTPManager(RTP管理器)、TrackContol(轨道控制器)、SendStream(发送数据流)、ReceiveStream(接收数据流)、InetAddress(IP地址)和SessionAddress(会话地址)等类使得编写网络实时数据传输变得容易,基于RTP协议的RTP应用程序框架为实现流媒体在网络中实时传输提供了Java程序框架,应用它可方便的实现多媒体数据流在网络中的实时传输。实时传输协议RTP是在Internet网上针对多媒体数据流的一种传输协议,RTP被定义为在一对一获一对多的传输情况下工作的,其目的是提供时间信息和实现多媒体数据流的同步。RTP由RTP和RTCP(实时控制协议)两个部分组成。RTP本身并不能为按顺序传送数据包提供可靠的传送机制,可不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。 2.2.2 JAVA 网络编程技术 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。   目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。 数据在Internet中是以有限大小的包形式传输的,这些包称为数据报(datagram).但是,由于数据报长度有限,通常必须将数据分解为多个包,在目的地再重新组合。有可能一包或多个包在传输中丢失或遭到破坏。由于网络视频会议的实时性要求,不可能让视频传输的每一贞都准确无误。而TCP协议正是为数据可靠传输而设计的。那么选择UDP协议,即用户数据报协议(User Datagram Protocol,UDP),就成为一种必然。 Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。在Java中,有专门的Socket类来处理用户的请求和响应。利用Socket类的方法,就可以实现两台计算机之间的通讯。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。 多播通信是一类特殊的IP地址(D类IP地址)这些IP地址并不和任何主机关联,而是专门为多播通信保留下来的,地址
重庆交通大学信息科学与工程学院 课程设计实验报告 专 业: 学 号: 姓 名: 实验室(中心): 信息技术软件实验室 指 导 教 师 : 实验完成时间: 2015 年 1 月 12 日 目录 实验设计题目---------------------------------------------------------------- -----2 实验目的-------------------------------------------------------------------- -------2 实验设计要求---------------------------------------------------------------- -----2 课程设计条件---------------------------------------------------------------- -----2 五、实验设计分析------------------------------------------------------------ ---------4 六、实验设计流程图---------------------------------------------------------- --------9 七、结果分析---------------------------------------------------------------- -----------13 八、实验心得体会------------------------------------------------------------ ---------14 九、实验主要代码------------------------------------------------------------ ---------15 实验设计题目 基于TCP的服务器/客户端程序设计 实验目的 理解客户端与服务器模型的工作原理。 掌握套接字的概念。 掌握TCP协议,基于TCP协议来设计此客户端/服务器程序。 通过设计面向连接的数据流传输服务程序,加深对面向连接的服务程序工作流程和基本 框架的理解。 实验设计要求 1)任选一种编程语言,编程实现面向连接的客户/服务器程序,客户端、服务器端分 别编程; 2) 编程要充分体现服务器端与客户端的连接建立、数据传输、连接释放的过程; 四、课程设计条件 本次课程设计我采用的是JAVA语言,实现客户端和服务器之间的联系。 Java 编程语言的风格十分接近C、C++语言。Java是一个纯的面向对象的程序设计语言,它继 承了 C++语言面向对象技术的核心Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再 被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成进 制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实 现了"一次编译、到处执行"的跨平台特性。不过,每次的执行编译后的字节码需要消耗 一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 Java语言的变量声明,操作符形式,参数传递,流程控制等方面和C语言,C++语言完 全相同.尽管如此,Java和C语言,C++语言又有许多差别,主要表现在如下几个方面: Java中对内存的分配是动态的,它采用面向对象的机制,采用运算符new为每个对象 分配内存空间,而且,实际内存还会随程序运行情况而改变。程序运行中 Java系统自动对内存进行扫描,对长期不用的空间作为"垃圾"进行收集,使得系统资源 得到更充分地利用.按照这种机制,程序员不必关注内存管理问题,这使Java程序的编写 变得简单明了,并且避免了由于内存管理方面的差错而导致系统出问题。而C语言通过m alloc()和free()这两个库函数来分别实现分配内存和释放内存空间的,C++语言中 则通过运算符new和delete来分配和释放内存。在C和C++这种机制中,程序员必须非常仔 细地处理内存的使用问题。一方面,如果对己释放的内存再作释放或者对未曾分配的内 存作释放,都会造成死机;而另一方面,如果对长期不用的或不再使用的内存不释放, 则会浪费系统资源,甚至因此造成资源枯竭。 Java不在所有类之外定义全局变量
java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集: JAVA核心知识点整理-282页 Java与哈希算法.docx Java中Lambda表达式的使用.docx JAVA多线程之线程间的通信方式.docx Java注解详解.docx Java线程池.docx JDK1.8Stream操作.docx JDK8有新特性.docx JVM堆三代.docx JVM的垃圾回收机制详解和调优.docx Spring源码分析之IoC.docx 关于线程和线程池的学习与使用.docx 深入理解JVM垃圾回收机制.docx 深入理解多线程实现的另一种方式Callable.docx 红黑树简介.docx 线程死锁及解决办法.docx 线程锁之重入锁.docx 线程间的通信.docx 虚拟机内存结构和垃圾回收docx.docx 锁分类的了解.docx 集合的扩容机制.png SpringMVC部分.docx Spring部分.docx 第一题.pdf 第七题 谈谈MySQL支持的事务隔离级别 (1).pdf 第三题 对比HashTable HashMap TreeMap有什么不同.pdf 第题 Exception Error区别.pdf 第五题 如何保证集合是线程安全的.pdf 第八题 Java并发类库提供的线程池有哪几种 分别有什么特点.pdf 第六题 synchronized和ReentLock有什么区别.pdf 第四题 ArrayList LinkedList Vector的区别.pdf docker讲得最清楚.doc Dubbo是什么?能做什么?.doc java 基于TCP协议的Socket编程和通信.doc Java面试高级篇—说说TCP,UDP和socket,Http之间联系和区别.doc MySQL千万级的大表要怎么优化(读写分离、水平拆分、垂直拆分).doc redis缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级.doc RPC (Remote Procedure Call)即远程过程调用.doc Spring 面试问题 TOP 50(干货推荐收藏必备).doc springboot常见面试题.doc svn和git的区别及适用场景.doc ZooKeeper.doc 为什么分布式一定要有Redis.doc 分布式、高并发、多线程,到底有什么区别.doc 分布式事务.doc 四款消息队列大比拼.docx 多台web服务器之间共享session.docx 消息中间件Kafka与RabbitMQ.doc 电商项目描述注意点.doc 秒杀业务的流量削峰场景如何解决.doc 面试题:Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点.doc

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值