从零探索Java网络编程01之 TCP/IP 与 Socket
最近完成了几项比较简单的项目, 终于是在996里偷了点闲暇时光, 想着来研究研究些啥吧? 一个普通的控制台日志映入了我的眼帘(孽缘呀):
(图中使用 SpringBoot 的 log4j 来输出日志, logginglevel: debug, jdk版本为1.8)
造成这种现象的原因可能是, Mybatis在执行接口方法时, 实例化了多个Preparedstatement, 启用了不同的NIO线程, 但是其中, 咦?! 没错, NIO中出了一段IO!!! (天哪!), 在查询网络资料后, 发现:
在 JDK 1.4 中原来的 I/O 包和 NIO 已经很好地集成了。 java.io.* 已经以 NIO 为基础重新实现了,所以现在它可以利用 NIO 的一些特性。例如, java.io.* 包中的一些类包含以块的形式读写数据的方法,这使得即使在更面向流的系统中,处理速度也会更快。[引用自: IBM官方教程]
简而言之, 就是如今的IO基本上已经与NIO集成, 在对某些单独的读写操作的测试里, 也可以看出如今版本的IO速度丝毫不逊于NIO. 所以在这里, 日志里会有NIO同时又存在IO, 两者互相辅佐, 当然NIO相对于IO的快, 是指, NIO更优于以下这些特性: 分散与聚集读取, 文件锁定, 网络异步IO, 高并发!!!
本着一些强迫症的驱使, 我就开始了这漫长的对Java网络编程的探索之旅. 路漫漫其修远兮, 朋友们, 一起前行! 倘若我在探索中走了哪些弯路, 欢迎评论指正!!! 在此, 本咸鱼不胜感激!!!
Java网络编程
传输控制协议(TCP,Transmission Control Protocol)
网络编程, 是指编写运行在多个设备上的程序, 这些设备都是通过网络连接的.
在J2SE规范中, java.net API 封装了低层次的通信细节, 供开发者专注于解决问题而非通信细节. 它提供了两种常见的网络协议的支持: TCP 和 UDP .
这里着重了解TCP 以及 TCP/IP
以下资料来源于度娘:
传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延 ( RTT ) 内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
总结来说, 就是如下图 ( TCP协议提供可靠的连接服务, 采用三次握手建立一个连接 ):
更加形象的表述就像是A到B家串门的情景, A先要通知B自己要去串门, 而B接受到这个消息后, 就发个消息回复A说: “六点有空你来吧,等不急啦!” 然后A也回复. “好嘞! 六点我就到!诶嘿嘿!!!” 最后, 六点A到了B家.
IP ( 因特网互联协议, Internet Protocol )
以下资料来源度娘:
IP层接收由更低层(网络接口层,例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层——TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
TCP / IP
OSI参考模型
Socket ( 套接字 )
套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
相关文章