1、什么是短连接
连接->传输数据->关闭连接
短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
短连接比较典型的例子就是http。 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
2、什么是长连接
连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
之所以出现粘包和半包现象,是因为TCP当中,只有流的概念,没有包的概念.
3、半包
指接受方没有接受到一个完整的包,只接受了部分,这种情况主要是由于TCP为提高传输效率,将一个包分配的足够大,导致接受方并不能一次接受完。(在长连接和短连接中都会出现)。
4、粘包与分包
指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。
1)发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
2)接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。分包是指在出现粘包的时候我们的接收方要进行分包处理。(在长连接中都会出现)
5、通信长度
实际应该根据需求和网络状况来决定。对于TCP,这个长度可以大点,Socket内部默认的收发缓冲区大小大概是8K。但对于UDP,就不要太大,一般在1024至10K。注意一点,无论发多大的包,IP层和链路层都会把你的包进行分片发送,一般局域网就是1500左右,广域网就只有几十字节。分片后的包将经过不同的路由到达接收方,对于UDP而言,要是其中一个分片丢失,那么接收方的IP层将把整个发送包丢弃,这就形成丢包。显然,要是一个UDP发包佷大,它被分片后,链路层丢失分片的几率就佷大,你这个UDP包,就佷容易丢失,但是太小又影响效率。最好可以配置这个值,以根据不同的环境来调整到最佳状态。
6、关于发送
明确一点,TCP作为流,发包是不会整包到达的,而是源源不断的到,那接收方就必须组包。而UDP作为消息或数据报,它一定是整包到达接收方。
7、关于接收
一般的发包都有包边界,首要的就是你这个包的长度要让接收方知道,于是就有个包头信息,对于TCP,接收方先收这个包头信息,然后再收包数据。一次收齐整个包也可以,可要对结果是否收齐进行验证。
这也就完成了组包过程。UDP,那你只能整包接收了。要是你提供的接收Buffer过小,TCP将返回实际接收的长度,余下的还可以收,而UDP不同的是,余下的数据被丢弃。
注意TCP,提供的Buffer佷大,那么可能收到的就是多个发包,必须分离它们;还有就是当Buffer太小,而一次收不完Socket内部的数据,那么Socket接收事件,可能不会再触发,使用事件方式进行接收时,密切注意这点。这些特性就是体现了流和数据包的区别。
8、问题
问题描述:在并发量比较大的情况下,就会出现一次接受并不能完整的获取所有的数据。
处理方式:
1)通过包头+包长+包体的协议形式,当服务器端获取到指定的包长时才说明获取完整。
2)指定包的结束标识,这样当我们获取到指定的标识时,说明包获取完整。
问题描述:什么时候需要考虑粘包的情况?
1)当时短连接的情况下,不用考虑粘包的情况
2)如果发送数据无结构,如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包
3)如果双方建立连接,需要在连接后一段时间内发送不同结构数据需要考虑粘包
注:粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包
备注:
一个包没有固定长度,以太网限制在46-1500字节,1500就是以太网的MTU,超过这个量,TCP会为IP数据报设置偏移量进行分片传输,现在一般可允许应用层设置8k(NTFS系)的缓冲区,8k的数据由底层分片传输
本文欢迎转载,转载请注明出处与作者
出处:http://blog.sina.com.cn/staratsky
作者:流星
分享到:
相关推荐
13. Java网络编程中的Socket超时:Socket超时是Java网络编程中的一个重要概念,指的是Socket对象的超时时间。Java程序员可以使用Socket超时来控制网络通信的超时时间。 14. Java网络编程中的网络异常处理:Java网络...
Java网络编程是Java开发中的重要领域,它涵盖了网络应用...提供的《Java网络编程实例》将可能包含这些概念的具体代码示例,帮助读者更好地理解和掌握相关技术。阅读和分析这些实例,是提升Java网络编程技能的有效途径。
本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java 网络编程是指使用 Java 语言...
此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的网络应用程序。 在Java网络编程中,首要涉及的是I/O模型。书中会介绍基础的套接字(Socket)编程,包括TCP和UDP协议...
第二章“流”是Java网络编程的核心概念。Java中的I/O流提供了处理输入和输出的强大工具,无论是处理文件、网络连接还是其他资源,流都扮演着关键角色。本章详细阐述了字节流和字符流的区别,以及如何使用InputStream...
Java网络编程是计算机科学中的一个重要领域,特别是在软件开发中,它涉及到如何通过网络进行数据传输和通信。在Java中,网络编程主要依赖于Java的Socket编程、ServerSocket、URL类以及NIO(非阻塞I/O)等核心API。这...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,包括TCP/IP协议、套接字(Socket)编程、多线程、HTTP、HTTPS等。在本资料中,《Java网络编程》第三版提供了深入浅出的讲解,旨在帮助...
《Java网络编程第三版》是Java开发者深入理解网络编程的重要参考资料。这本书主要涵盖了Java平台上的网络应用程序开发,从基础概念到高级技术,为读者提供了一套全面的学习路径。以下是本书中涉及的一些关键知识点:...
Java网络编程是开发分布式应用程序的关键技术,它使得Java程序能够与其他设备、系统和服务进行通信。本书《Java网络编程实例:Java网络编程实例》显然聚焦于通过实际案例来教授这一核心技能。以下是一些主要的知识点...
本压缩包包含的源代码覆盖了Java网络编程的各种核心概念和技术,旨在帮助开发者实践并提升网络编程技能。 1. **基础概念**: - **套接字(Sockets)**:Java中的Socket类和ServerSocket类是网络通信的基础,它们...
通过这个清华版的PPT,学习者不仅可以掌握Java网络编程的基本原理和技术,还能了解到一些高级话题和最佳实践,对于提升网络编程技能大有裨益。每一章节的多媒体课件PPT应该都详细地阐述了这些内容,并可能配有实例...
这份《java网络编程》的电子课件,显然是为了帮助开发者深入理解和掌握这些核心概念而设计的。 首先,我们需要理解Java在网络编程中的基础——Socket编程。Java的Socket类提供了客户端与服务器端通信的基本接口,它...
总的来说,"Java网络编程.chm"这本书涵盖了网络编程的基本概念、核心技术以及实际应用,对于学习和提升Java网络编程技能非常有帮助。通过阅读和实践书中的例子,开发者能够掌握创建网络应用程序、处理网络请求和响应...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,包括TCP/IP协议栈、套接字(Socket)编程、多线程、数据传输格式等。孙卫琴的《java网络编程》一书深入浅出地讲解了这些核心概念,并...
Java网络编程是开发分布式应用程序的关键技术,它允许Java程序与其他计算机进行通信,实现数据的交换。这份"Java网络编程资料"包含三个重要的学习资源:关于Socket套接字的"Java套接字编程.chm"、关于网络协议特别是...
《JAVA网络编程大全》是一本全面且深入介绍Java网络编程技术的权威著作,旨在帮助读者掌握Java在构建网络应用程序中的核心概念和实践技巧。PDF版的书籍为学习者提供了便捷的电子阅读体验,随时随地都能深化对Java...
《Java网络编程》是编程领域的经典著作,尤其对于学习Java网络编程的初学者及进阶者来说,这本书具有很高的参考价值。它详细介绍了如何利用Java语言进行网络通信,涵盖了网络编程的基本概念、协议以及实现方法。 一...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念,包括TCP/IP协议、套接字(Socket)编程、HTTP协议、多线程、输入/输出流等。这个"java网络编程课件.zip"文件很可能是为学习者提供了一个全面...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,使得Java应用程序能够通过网络进行数据传输和交互。在本节中,我们将深入探讨Java网络编程的关键知识点,包括套接字(Socket)编程、多...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,使得Java应用程序能够通过互联网进行数据传输和交互。本教程详细介绍了这一主题,旨在帮助初学者和有一定经验的开发者深入理解Java网络...