JavaSE——网络编程基础知识
计算机网络的分类:
局域网(LAN)
指在一个较小地理范围内的各种计算机网络设备互联在一起的通信网络,可以包括一个或多个子网,通常局限在几千米的范围之内。
城域网(MAN)
主要由城域范围内的各个局域网之间互连构成。
广域网(WAN)
由距离较远的局域网与城域网互联构成的通信网络,通常是除了计算机设备以外,还要涉及一些电信通信方式。
OSI分层模型:
应用层 |
表示层 |
会话层 |
传输层 |
网络层 |
数据链路层 |
物理层 |
TCP/IP分层模型:
应用层 [数据段] |
传输层 [数据包] |
网络互连层 [数据帧] |
物理层+数据链路层(主机到网络层) [比特] |
TCP/IP参考模型的层次结构:
TCP/IP的报文格式:
IP地址和端口号:
IP地址用来标志网络中的一个通信实体,这些通信实体可以是一台主机,一台打印机或者路由器的某一个端口。简单来说,IP 地址好比家的地址,家里的卧室餐厅等相当于不同的端口。
IP地址被分成A、B、C、D、E五类:
A类:10.0.0.0~10.255.255.255
B类:172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255
在Internet上IP地址和主机名是一一对应的,通过域名解析可以由主机名得到机器的IP,由于机器名更接近自然语言,容易记忆,所以使用比IP地址广泛,但是对机器而言只有IP地址才是有效的标识符。
端口是一个16位的整数,用来表示数据交给那个通信实体处理。因此,端口是通信程序与外界交流的出入口,它是一综抽象的软件结构,包括一些数据结构和I/O缓冲区。端口号可以是0~65535,通常被分为三类:
公认端口:0~1023
注册端口:1024~49151
动态/私有端口:49152~65535
通常一台主机上总是有很多个进程需要网络资源进行网络通讯。网络通讯的对象准确的讲不是主机,而应该是主机中运行的进程。这时候光有主机名或IP地址来标识这么多个进程显然是不够的。端口号就是为了在一台主机上提供更多的网络资源而采取得一种手段,也是TCP层提供的一种机制。只有通过主机名或IP地址和端口号的组合才能唯一的确定网络通讯中的对象:进程。
TCP/IP协议:
Internet网络采用的是TCP/IP协议,在全球范围内实现不同硬件结构、不同操作系统、不同网络系统的互联。Internet网上存在的每台主机用为其分配的Internet地址代表自己,这个地址就是IP地址。到目前为止,IP地址用4字节也就是32位二进制表示,成为IPv4。为了便于使用,通常取每个字节的十进制数,并且每个字间用圆点隔开表示IP地址
传输控制协议/网间协议。
定义主机如何连入英特网及数据如何在他们之间传输的标准。
TCP握手协议:
服务端与客户端建立连接协议(三次握手)
客户端发送一个带SYN(synchronize 即握手信号)标志的TCP报文到服务器,这是三次握手中的报文一;
服务端回应客户端的,这是三次握手中的第二个报文,这个报文同时带ACK(Acknowledgement 中文译为”确认字符“。它的作用是确认发来的数据已经接受无误)标志,表示对刚才客户端SYN报文的回应;同时有标志SYN给客户端,询问客户端是否准备好进行数据通讯。
客户端此时会再次回应服务端一个ACK保温,这是报文段三。
完成三次握手,客户端与服务端开始传送数据。
连接终止协议(四次挥手)
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,这原则是当一方完成他的数据发送任务后就能发送一个FIN来终止这个方向上的连接,收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据,首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP客户端发送一个FIN,用来关掉客户端到服务器的数据传送(报文段4);
服务器收到这个FIN,它发挥一个ACK,确认序号为收到的序号加一(报文段5),和SYN一样,一个FIN将占用一个序号。
服务器关闭客户端的连接,发送一个FIN给客户端(报文6);
客户端发回ACK报文表示确认,并将确认序号设置为收到的序号加一(报文段7)。
连接终止过程中的四个状态:
FIN_WAIT_1:server 端主动要求关闭TCP连接,并且主动发送FIN后,等待cliect端回复ACK的状态,对于client来说,即等待接受FIN报文的状态。
FIN_WAIT_2:当client端回复 ACK报文后进入的状态。一般情况下,客户端一旦收到FIN报文就会立刻回复ACK,所以FIN_WAIT_1状态比较少见。
TIME_WAIT:主动关闭的一方在完成自身发起的关闭请求后(即断开连接),接收到被动一方的FIN后进入的状态。
CLOSE_WAIT:被动关闭方此时正等待上层应用发出关闭连接指令。
端口和套接字socket:
端口:一般而言,一台计算机只有单一的连到网络的物理连接,所有数据都通过此连接对内、外送达特定的计算机,这就是端口。网络程序设计中的端口(port)并非真实的物理存在,而是一个假想的连接装置。
端口被规定为0-65535之间的整数,HTTP服务一般使用80端口,FTP服务使用21端口。假如一台计算机提供了HTTP、FTP多种服务,那么客户机会通过不同点端口来确定连接到服务器的哪项服务上。
常见的一些协议和它们对应的服务端口号:
套接字:socket 通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。用于将应用程序和 端口连接起来。也是一个假想的连接装置,就像插插头的设备“插座”用于连接电器和电线一样。
在每个TCP、UDP数据段中都包含源端口和目标端口字段。有时,我们把一个IP地址和一个端口号合称为一个套接字(Socket),而一个套接字对(Socket pair)可以唯一地确定互连网络中每个TCP连接的双方(客户IP地址、客户端口号、服务器IP地址、服务器端口号)。
java将套接字抽象为类,只需创建 Socket类对象,即可使用套接字。
Socket 和 ServerSocket 类库位于java.net包中。ServerSocket用于服务器端,Socket建立网络连接时使用。在连接成功时,应用程序两端都会产生一个Socket 实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务端还是客户端而产生不同的级别,不管是Socket 还是 ServerSocket它们的工作都是通过SocketImp1 类及其子类完成的。
使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。 Server端和Client端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.
总结:
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
JavaSE——网络编程基础知识的更多相关文章
- C#网络编程基础知识
C#网络编程基础知识一 1.IPAddress类 用于表示一个IP地址.IPAddress默认构造函数 public IPAddress(long address);一般不用 其中Parse()方法最 ...
- 1.unix网络编程基础知识
接触网络编程一年多了,最近在系统的学习vnp两本书,对基础知识做一些总结,希望理解的更透彻清晰,希望能有更多的沉淀. 1.套接口地址 针对IPv4和IPv6地址族,分别定义了两种类型的套接口地址:so ...
- windows socket网络编程基础知识
下面介绍网络7层协议在WINDOWS的实现: 7层协议 WIN系统 ________________________________________ 7 应用层 7 应用程序 ____________ ...
- 【Java基础】Java网络编程基础知识
什么是网络编程 网络编程是通过使用套接字来达到进程间通信目的,那什么是套接字呢?其实套接字是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的 ...
- JAVA网络编程基础知识
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协 ...
- Windows网络编程基础知识
1.WinSock的初始化 #include<iostream> #include<WinSock2.h> #include<MSWSock.h> #pragma ...
- python网络编程基础知识整理
- 大数据学习笔记——Java篇之网络编程基础
Java网络编程学习笔记 1. 网络编程基础知识 1.1 网络分层图 网络分层分为两种模型:OSI模型以及TCP/IP网络模型,前者模型分为7层,是一个理论的,参考的模型:后者为实际应用的模型,具体对 ...
- Java网络编程基础(Netty预备知识)
今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...
随机推荐
- 【2019北京集训2】duck 线段树优化建图+tarjan
题目大意:给你$n$个点,第$i$个点有点权$v_i$.你需要将这$n$个点排成一排,第$i$个点的点权能被累加当且仅当这个点前面存在编号在$[l_i,r_i]$中的点,问你这些点应该如何排列,点权和 ...
- zookeeper+kafka集群的安装部署
准备工作 上传 zookeeper-3.4.6.tar.gz.scala-2.11.4.tgz.kafka_2.9.2-0.8.1.1.tgz.slf4j-1.7.6.zip 至/usr/local目 ...
- div居中的几种方式
摘自:https://www.cnblogs.com/ones/p/4362531.html DIV居中的几种方法 1. 1 body{ 2 text-align:center; 3 } 缺点:b ...
- Postgresql 字符串操作函数
样例测试: update property set memorial_no = btrim(memorial_no, ' ') where memorial_no like ' %' 或:update ...
- 微信正式开放内测“小程序”,不开发APP的日子真的来了?
关注,QQ群,微信应用号社区 511389428 微信正式开放内测“小程序”,不开发APP的日子真的来了? 明星公司 缪定纯 • 2016-09-22 09:05 讨论了很久的微信应用号终于来了,不过 ...
- Selenium自动化测试Python三:WebDriver进阶
WebDriver 进阶 欢迎阅读WebDriver进阶讲义.本篇讲义将会重点介绍Selenium WebDriver API的重点使用方法,以及使用模块化和参数化进行自动化测试的设计. WebDri ...
- Java中的日志管理
日志是应用程序运行中不可缺少的一部分,JAVA中有很多已经成熟的方案,尽管记录日志是应用开发中并不可少的功能,在 JDK 的最初版本中并不包含日志记录相关的 API 和实现.相关的 API(java. ...
- 记一次cocos项目的加载速度优化
半个月前,我们用cosos creator做了一个简单的小游戏,也许算不上小游戏吧..一边学cocos,一边做,几经波折后终于上线了.然鹅,功能是实现了,但是加载速度十分感人(毕竟没经验嘛,无辜脸). ...
- 分享 : 警惕MySQL运维陷阱:基于MyCat的伪分布式架构
分布式数据库已经进入了全面快速发展阶段.这种发展是与时俱进的,与人的需求分不开,因为现在信息时代的高速发展,导致数据量和交易量越来越大.这种现象首先导致的就是存储瓶颈,因为MySQL数据库实质上还是一 ...
- CVPR2019 | Mask Scoring R-CNN 论文解读
Mask Scoring R-CNN CVPR2019 | Mask Scoring R-CNN 论文解读 作者 | 文永亮 研究方向 | 目标检测.GAN 推荐理由: 本文解读的是一篇发表于CVPR ...