- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JavaTCPIPSocket编程笔记
Java TCP/IP Socket 编程 笔记(一)—基本概念
一些概念: 通信信道(communication channel):将字节序列从一个主机传输到另一个主机的一种手段,可能是有线电缆,如以太网(Ethernet),也可能是无线的,如WiFi,或是其他方式的连接。 信息(information)是指由程序创建和解释的字节序列。在计算机网络环境中,这些字节序列称为分组报文(packet)。 协议(protocol)相当于相互通信的程序达成的一种约定,它规定了分组报文的交换方式和它们包含的意义。一组协议规定了分组报文的结构(例如报文中的哪一部分表明了目的地址)以及怎样对报文中所包含的信息进行解析。 TCP和UDP属于传输层,IP属于网络层,TCP,UDP和IP的具体实现通常驻留在主机的操作系统中。应用程序通过套接字API对UDP协议和TCP协议所提供的服务进行访问。 IP协议提供了一种数据报服务:每组分组报文都由网络独立处理和分发,就像信件或包裹通过邮政系统发送一样。IP报文必须包含一个保存其目的地址的字段,就像你所投递的每份包裹都写明了收件人地址一样。 TCP协议和UDP协议使用的地址叫做端口号,都是用来区分同一主机中的不同应用程序的。 客户端(client)是通信的发起者,而服务器(server)程序则被动等待客户端发起通信,并对其作出响应。 一个程序是作为客户端还是服务器,决定了它在与其对等端(peer)建立通信时使用的套接字API(客户端的对等端是服务器,反之亦然)。客服端必须首先知道服务器端的地址和端口号,反之则不需要。这个打电话类似。只要通信连接建立成功,服务器和客户端之间就没有区别了。 Socket(套接字)是一种抽象层,应用程序通过它来发送和接受数据,就像应用程序打开一个文件句柄,将数据读写到稳定的存储器上一样。一个TCP/IP套接字由一个互联网地址,一个端对端协议(TCP或UDP协议)以及一个端口号唯一确定。
几个重要的TCP/IP选项解析(Java Socket)
文章分类:Java编程
1. SO_LINGER / SO_REUSEADDR ??? TCP正常的关闭过程如下(四次握手过程):(FIN_WAIT_1) A?????? ---FIN---?????? B(CLOSE_WAIT)(FIN_WAIT_2) A?????? --ACK--?????? B(CLOSE_WAIT)? (TIME_WAIT)A??????? --FIN----?????? B(LAST_ACK)? (TIME_WAIT)A??????? ---ACK-?????? B(CLOSED)??? ?? A端首先发送一个FIN请求给B端,要求关闭,发送后A段的TCP状态变更为FIN_WAIT_1,接收到FIN请求后B端的TCP状态变更为CLOSE_WAIT??? ?? B接收到ACK请求后,B回一个ACK给A端,确认接收到的FIN请求,接收到ACK请求后,A端的TCP状态变更为为FIN_WAIT_2。??? ?? B端再发送一个FIN请求给A端,与连接过程的3次握手过程不一样,这个FIN请求之所以并不是与上一个请求一起发送,之所以如此处理,是因为TCP是双通道的,允许在发送ACK请求后,并不马上发FIN请求,即只关闭A到B端的数据流,仍然允许B端到A端的数据流。这个ACK请求发送之后,B端的TCP 状态变更为LAST_ACK,A端的状态变更为TIME_WAIT。??? ?? A端接收到B端的FIN请求后,再回B端一个ACK信息,对上一个FIN请求进行确认,到此时B端状态变更为CLOSED,Socket可以关闭。?? 除了如上正常的关闭(优雅关闭)之外,TCP还提供了另外一种非优雅的关闭方式RST(Reset)?? (CLOSED) A???????? ---RST--????? B (CLOSED)?? ?? A端发送RST状态之后,TCP进入CLOSED状态,B端接收到RST后,也即可进入CLOSED状态。??? 在第一种关闭方式上(优雅关闭),非常遗憾,A端在最后发送一个ACK请求后,并不能马上将该Socket回收,因为A并不能确定B一定能够接收到这个 ACK请求,因此A端必须对这个Socket维持TIME_WAIT状态2MSL(MSL=Max Segment Lifetime,取决于操作系统和TCP实现,该值为30秒、60秒或2分钟)。如果A端是客户端,这并不会成为问题,但如果A端是服务端,那就很危险了,如果连接的Socket非常多,而又维持如此多的TIME_WAIT状态的话,那么有可能会将Socket耗尽(报Too Many Open File)
文档评论(0)