`
别惹Java
  • 浏览: 45535 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java网络编程(一) TCP/IP,http,socket,长连接,短连接

 
阅读更多

TCP/IP

 TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。
 
在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
 
传输层中有TCP协议与UDP协议。
 
应用层:TCP包括FTPHTTPTELNETSMTP等协议

                 UDP包括DNSTFTP等协议

 

短连接:

连接->传输数据->关闭连接
   HTTP
是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
   
也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。

 

长连接:

连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
   
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

 

http的长连接:

HTTP也可以建立长连接的,使用Connection:keep-aliveHTTP 1.1默认进行持久连接。HTTP1.1HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(
似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。

 

什么时候用长连接,短连接?

    长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

 

而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

 

总之,长连接和短连接的选择要视情况而定。

 

发送接收方式

1、异步

报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况:

(1)异步双工:接收和发送在同一个程序中,由两个不同的子进程分别负责发送和接收

(2)异步单工:接收和发送是用两个不同的程序来完成。

2、同步

报文发送和接收是同步进行,既报文发送后等待接收返回报文。 同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。

 

在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。



Socket是什么

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。




Socket 通信示例



 主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP UPD 的地址也就是端口号来指定。这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。




建立通信链路

当客户端要与服务端通信,客户端首先要创建一个 Socket 实例,操作系统将为这个 Socket 实例分配一个没有被使用的本地端口号,并创建一个包含本地和远程地址和端口号的套接字数据结构,这个数据结构将一直保存在系统中直到这个连接关闭。在创建 Socket 实例的构造函数正确返回之前,将要进行 TCP 的三次握手协议,TCP 握手协议完成后,Socket 实例对象将创建完成,否则将抛出 IOException 错误。

与之对应的服务端将创建一个 ServerSocket 实例,ServerSocket 创建比较简单只要指定的端口号没有被占用,一般实例创建都会成功,同时操作系统也会为 ServerSocket 实例创建一个底层数据结构,这个数据结构中包含指定监听的端口号和包含监听地址的通配符,通常情况下都是“*”即监听所有地址。之后当调用 accept() 方法时,将进入阻塞状态,等待客户端的请求。当一个新的请求到来时,将为这个连接创建一个新的套接字数据结构,该套接字数据的信息包含的地址和端口信息正是请求源地址和端口。这个新创建的数据结构将会关联到 ServerSocket 实例的一个未完成的连接数据结构列表中,注意这时服务端与之对应的 Socket 实例并没有完成创建,而要等到与客户端的三次握手完成后,这个服务端的 Socket 实例才会返回,并将这个 Socket 实例对应的数据结构从未完成列表中移到已完成列表中。所以 ServerSocket 所关联的列表中每个数据结构,都代表与一个客户端的建立的 TCP 连接

 

备注:

Windows 下单机最大TCP连接数

调整系统参数来调整单机的最大TCP连接数,Windows 下单机的TCP连接数有多个参数共同决定:

以下都是通过修改注册表[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]

 

1.    最大TCP连接数        TcpNumConnections

2.    TCP关闭延迟时间    TCPTimedWaitDelay    (30-240)s

3.    最大动态端口数   MaxUserPort  (Default = 5000, Max = 65534) TCP客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为 1024-5000 ,也就是说默认情况下,客户端最多可以同时发起3977 Socket 连接

4.   最大TCB 数量   MaxFreeTcbs

系统为每个TCP 连接分配一个TCP 控制块(TCP control block or TCB),这个控制块用于缓存TCP连接的一些参数,每个TCB需要分配 0.5 KBpagepool 0.5KB Non-pagepool,也就说,每个TCP连接会占用 1KB 的系统内存。

Server版本,MaxFreeTcbs 的默认值为1000 64M 以上物理内存)Server 版本,这个的默认值为 2000。也就是说,默认情况下,Server 版本最多同时可以建立并保持2000TCP 连接。

5.   最大TCB Hash table 数量   MaxHashTableSize 

TCB 是通过Hash table 来管理的。

这个值指明分配 pagepool 内存的数量,也就是说,如果MaxFreeTcbs = 1000 , pagepool 的内存数量为 500KB那么 MaxHashTableSize 应大于 500 才行。这个数量越大,则Hash table 的冗余度就越高,每次分配和查找 TCP  连接用时就越少。这个值必须是2的幂,且最大为65536.

 

IBM WebSphere Voice Server windows server 2003 下的典型配置

MaxUserPort = 65534 (Decimal)

MaxHashTableSize = 65536 (Decimal)

MaxFreeTcbs = 16000 (Decimal)

这里我们可以看到 MaxHashTableSize 被配置为比MaxFreeTcbs 4倍,这样可以大大增加TCP建立的速度。

 

参考资料:

http://blog.csdn.net/yangzl2008/article/details/7366428(TCP/IPhttpsocket,长连接,短连接)

              http://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html(深入分析 Java I/O 的工作机制)

  • 大小: 55.4 KB
  • 大小: 107.9 KB
分享到:
评论
1 楼 bin_1715575332 2013-07-23  
好文章,为何没人顶?

相关推荐

    Java+TCP/IP+Socket编程++原书第2版.pdf

    总的来说,《Java + TCP/IP + Socket编程++ 原书第2版》可能会涵盖这些主题:TCP/IP协议基础,Java Socket API的使用,异常处理,多线程编程,以及网络编程的最佳实践。这本书将帮助开发者深入理解如何在Java环境中...

    java TCP/IP socket 编程(原书第2版)pdf+源码

    Java TCP/IP Socket编程是Java网络通信...总的来说,"java TCP/IP socket 编程(原书第2版)"是一本深入解析Java网络编程的书籍,通过阅读和实践,你将能够熟练掌握Socket编程,为构建稳定的网络应用程序打下坚实基础。

    基于TCP/IP协议的Socket编程

    套接字(Socket)是一种编程接口,允许程序员把网络连接当成一个流,并向这个流读写字节。Socket对程序员掩盖了网络的低层细节,如纠错、包大小、包重传、网络地址等。在Client/Server模式中,套接字(Socket)概念...

    Socket服务端客户端以tcp/ip协议发送接收报文

    在IT领域,网络通信是不可或缺的一部分,而Java Socket编程则是实现网络通信的一种常见方式,尤其在TCP/IP协议栈上。本教程将详细讲解如何利用Java Socket实现基于TCP/IP的服务端和客户端之间的报文发送与接收。 ...

    Java TCP/IP Socket编程

    Java TCP/IP Socket编程是Java网络编程中的重要组成部分,它提供了在网络间进行数据传输的基础机制。TCP(Transmission Control Protocol)和IP(Internet Protocol)是互联网上最基础的通信协议,而Socket则是TCP/...

    TCP/IPsocket长连接

    在IT行业中,TCP/IP Socket长连接是网络编程中一个重要的概念,特别是在移动设备如安卓手机与服务器进行实时通信时。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而Socket是TCP/IP...

    Java TCP IP Socket编程(原书第2版).

    《Java TCP/IP Socket编程(原书第2版)》基于TCP/IP Socket相关原理,对如何在Java中进行Socket...《Java TCP/IP Socket编程(原书第2版)》适合作为Java Socket编程的入门教程,也可供从事网络相关专业的技术人员参考。

    Java+TCP/IP+Socket编程++原书第2版

    《Java+TCP/IP+Socket编程++原书第2版》是一部深入探讨Java网络编程的权威著作,主要聚焦于TCP/IP协议栈与Socket编程技术。在Java编程领域,掌握网络通信能力是开发分布式系统、服务器端应用以及实时数据传输等项目...

    Java+TCP/IP+Socket编程 原书第2版

    在7CP/IP Socket首次发布时,Java作为一个新的未被关注的编程语 言刚出现。然而,自2001年以来,Java的网络编程能力已经得到了很大程度的扩展,而且 持续的应用优势已经使其成为了一个占主导地位的平台。考虑到Java...

    Java网络编程TCP/IP 实例源码

    Java网络编程是构建分布式系统和互联网应用的基础,TCP/IP协议栈则是网络通信的核心。本实例源码集专注于Java实现的TCP/IP网络编程,适合初学者和有经验的开发者加深理解。下面将详细介绍其中涉及的关键知识点。 一...

    java 网络编程tcp/ip

    Java网络编程TCP/IP是Java开发...总的来说,Java网络编程TCP/IP是开发者必须掌握的基础技能之一,它涵盖了网络连接的建立、数据交换、协议处理等多个方面。理解并熟练运用这些知识,将有助于构建高效、可靠的网络应用。

    TCP/IP Socket in C/Java

    两本TCP/IP socket编程书,分别是C语言和Java语言版的。都是文字版的pdf文档。 1. TCP/IP Sockets in Java (2th Edtion) 2. TCP/IP Sockets in C *Series Editor: Michael J. Donahoo

    TCP.IP.Sockets.in.Java.2nd.Edition.pdf (TCP/IP Socket 编程)

    根据提供的文件信息,...以上知识点构成了对《TCP/IP Sockets in Java, 2nd Edition.pdf》文件的详细解析,涵盖了TCP/IP和Socket编程的基础知识,Java实现网络通信的方法,以及网络编程在实际中的应用实例和高级主题。

    Java socket tcp/ip

    Java套接字(Socket)是Java编程中用于网络通信的核心组件,它基于传输控制协议/因特网协议(TCP/IP)模型。TCP/IP是互联网上应用最广泛的一种通信协议,确保了数据的可靠传输。本篇文章将深入探讨Java中如何使用...

    Java TCP/IP Socket编程原书第2版.pdf

    Java TCP/IP Socket编程原书第2版.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!

    Java TCP/IP Socket编程 原书第2版

    对Socket编程的重点进行了集中简明的介绍,以使读者能够迅速掌握;并且使工程师们能够迅速地将所学的技能应用到他们的日常工作中。 对最新的Java平台(1.7)进行了简明而紧随其发展的介绍,使开发者即使在最新的技术...

    Java TCP /IP socket 自制简易聊天工具

    Java TCP/IP Socket编程是网络通信领域中的核心技术,它允许两台计算机通过Internet进行双向通信。在这个自制品中,我们看到的是一个基于Java实现的简单聊天工具,它利用Socket API构建了一个用户界面,使得用户可以...

    Java_TCP_IP_Socket编程(原书第2版)

    Java TCP/IP Socket编程是网络通信领域中的核心技术,尤其在Java平台中,Socket是实现客户端与服务器之间通信的基础。原书第二版深入浅出地讲解了Java Socket编程的各个方面,为开发者提供了全面的学习资源。以下是...

Global site tag (gtag.js) - Google Analytics