共计 6481 个字符,预计需要花费 17 分钟才能阅读完成。
什么是网络编程
什么是网络?
在计算机领域中,网络是信息传输、承受、共享的虚构平台。
通过它把各个点、面、体的信息分割到一起,从而实现这些资源的共享。
什么是网络编程?
网络编程从大的方面就是说对信息的发送接管。
通过操作相应 API 调度计算机资源硬件,并且利用管道(网线)进行数据交互的过程。
更为具体的波及:网络模型、套接字、数据包。
7 层网络模型 -OSI
互联网的实质就是 一系列的网络协议,这个协定就叫 OSI 协定(一系列协定),依照性能不同,分工不同,人为的分层七层。实际上这个七层是不存在的。没有这七层的概念,只是人为的划分而已。辨别进去的目标只是让咱们明确哪一层是干什么用的。
每一层都运行不同的协定。
实际上也能够把它划成五层、四层。
七层 划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
五层 划分为:应用层、传输层、网络层、数据链路层、物理层。
四层 划分为:应用层、传输层、网络层、网络接口层。
应用层
用户应用的都是应用程序,均工作于应用层,大家都能够开发本人的应用程序,数据多种多样,必须规定好数据的组织模式。
应用层性能:规定应用程序的数据格式。
比方 TCP 协定能够为各种各样的程序传递数据,比方 Email、WWW、FTP 等。那么,必须有不同协定规定电子邮件、网页、FTP 数据的格局,这些应用程序协定就形成了”应用层”。
表示层
表示层的用处是提供一个可供应用层抉择的服务的汇合,使得应用层能够依据这些服务性能解释数据的含意。表示层以下各层只关怀如何牢靠地传输数据,而表示层关怀的是所传输数据的体现形式、它的语法和语义。示意服务的例子有对立的数据编码、数据压缩格局和加密技术等。
会话层
会话层工作是:向两个实体的表示层提供建设和应用连贯的办法。将不同实体之间的表示层的连贯称为会话。因而会话层的工作就是组织和协调两个会话过程之间的通信,并对数据交换进行治理。
传输层
传输层是通信子网和资源子网的接口和桥梁,起到承前启后的作用。
该层的次要工作是:向用户提供牢靠的端到端的过错和流量管制,保障报文的正确传输。传输层的作用是向高层屏蔽上层数据通信的细节,即向用户通明地传送报文。
该层常见的协定:TCP/IP 中的 TCP 协定、Novell 网络中的 SPX 协定和微软的 NetBIOS/NetBEUI 协定。
传输层提供会话层和网络层之间的传输服务,这种服务从会话层取得数据,并在必要时,对数据进行宰割。而后,传输层将数据传递到网络层,并确保数据能正确无误地传送到网络层。因而,传输层负责提供两节点之间数据的牢靠传送,当两节点的分割确定之后,传输层则负责监督工作。综上,传输层的次要性能如下:
传输连贯治理:提供建设、保护和拆除传输连贯的性能。传输层在网络层的根底上为高层提供 面向连贯 和面向无连贯 的两种服务。
网络层
网络层的作用是在网络与网络相互连接的环境中,将数据从发送端主机发送到承受端主机。
举例:
我在学校教室中,我想找隔壁班的妹子,我告诉小弟去通知她,说有个帅哥找你。而小弟就是 网关 ,IP 地址 就是我所处的教室,MAC 地址 就是我在教室的某个地位。
数据链路层、物理层
晚期的时候,数据链路层就是来对电信号来做分组的。以前每个公司都有本人的分组形式,十分的乱,起初造成了对立的规范,即以太网协定 Ethernet。
通信传输实际上是通过物理的传输介质实现的。数据链路层的作用就是在这些同构传输介质互连的设施之间进行数据处理。
物理层中,将数据的 0、1 转换为电压和脉冲光传输给物理的传输介质,而互相直连的设施之间应用地址实现传输。这种地址被称为 MAC 地址,也可称为物理地址或硬件地址。采纳 MAC 地址信息的首部附加到从网络层转发过去的数据上,将其发送到网络。
网络层与数据链路层都是基于指标地址将数据发送给接收端的,然而网络层负责将整个数据发送给最终目标地址。而数据链路层则只负责发送一个分段内的数据。
OSI 七层网络模型 | TCP/IP 四层概念模型 | 对应网络协议 |
---|---|---|
应用层(Application) | 应用层 | HTTP、TFTP, FTP, NFS, WAIS、SMTP |
表示层(Presentation) | 应用层 | Telnet, Rlogin, SNMP, Gopher |
会话层(Session) | 应用层 | SMTP, DNS |
传输层(Transport) | 传输层 | TCP, UDP |
网络层(Network) | 网络层 | IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层(Data Link) | 数据链路层 | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层(Physical) | 数据链路层 | IEEE 802.1A, IEEE 802.2 到 IEEE 802.11 |
OSI 的封包与解包过程
Socket 与 TCP、UDP
什么是 Socket
- 简略来说是 IP 地址与端口的联合协定(RFC 793)
- 一种地址与端口的联合形容协定。
- TCP/IP 协定的相干 API 的总称;是网络 API 的汇合实现。
- 在计算机通信畛域,Socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种形式。通过 Socket 这种约定,一台计算机能够接管其余计算机的数据,也能够向其余计算机发送数据。
Socket 的作用与组成
- 在网络传输中用于惟一标识两个端点之间的连贯。
- 端点:包含(IP + Port)
- 四个因素:客户端地址、客户端端口、服务器地址、服务器端口。
Socket 流程
服务器端先初始化 Socket,而后与端口绑定(bind),对端口进行监听(listen),调用 accept 开始阻塞,期待客户端连贯。在这时如果有个客户端初始化一个 Socket,而后连贯服务器(connect),如果连贯胜利,这时客户端与服务器端的连贯就建设了。客户端发送数据申请,服务器端接管申请并解决申请,而后把回应数据发送给客户端,客户端读取数据,最初敞开连贯,一次交互完结。
Socket 之 TCP
- TCP 是面向连贯的通信协议
-
通过三次握手建设连贯,通信实现时要拆除连贯
第一次握手
:客户端发送带有 SYN 标记的连贯申请报文段,而后进入 SYN_SEND 状态,期待服务端确认。第二次握手
:服务端承受到客户端的 SYN 报文段后,须要发送 ACK 信息对这个 SYN 报文段进行确认。同时,还要发送本人的 SYN 申请信息。服务端会将上述信息放到一个报文段(SYN+ACK 报文段) 中,一并发送给客户端,此时服务端进入 SYN_RECV 状态。第三次握手
:客户端接管到服务端的 SYN+ACK 报文段后,会向服务端发送 ACK 确认报文段,这个报文段发送结束后,客户端和服务端都进入 ESTABLEISHED 状态,实现 TCP 三次握手。
- 因为 TCP 是
面向连贯
的所以只能用于端到端的通信。
Socket 之 UDP
- UDP 是
面向无连贯
的通信协定。 - UDP 数据包含指标端口号和源端口号信息。
- 因为通信不须要连贯,所以能够实现播送发送,并不局限于端到端。
Client-Server Application
- TCP/IP 协定中,两个过程间通信的次要模式为:CS 模型。
- 次要目标:协同网络中的计算机资源、服务模式、过程间数据共享。
- 常见的:
HTTP
、FTP
、SMTP
Socket TCP 根底代码实战
客户端代码:
/**
* @author Jack
*/
public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket();
// 超时工夫
socket.setSoTimeout(3000);
// 连贯本地,端口 2000;超时工夫 3000ms
socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000), 3000);
System.out.println("已发动服务器连贯...");
System.out.println("客户端信息:" + socket.getLocalAddress() + "P:" + socket.getLocalPort());
System.out.println("服务器信息:" + socket.getInetAddress() + "P:" + socket.getPort());
try {
// 发送接收数据
todo(socket);
} catch (Exception e) {System.out.println("异样敞开");
}
// 开释资源
socket.close();
System.out.println("客户端已退出~");
}
private static void todo(Socket client) throws IOException {
// 构建键盘输入流
InputStream in = System.in;
BufferedReader input = new BufferedReader(new InputStreamReader(in));
// 失去 Socket 输入流,并转换为打印流
OutputStream outputStream = client.getOutputStream();
PrintStream socketPrintStream = new PrintStream(outputStream);
// 失去 Socket 输出流,并转换为 BufferedReader
InputStream inputStream = client.getInputStream();
BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));
boolean flag = true;
do {
// 键盘读取一行
String str = input.readLine();
// 发送到服务器
socketPrintStream.println(str);
// 从服务器读取一行
String echo = socketBufferedReader.readLine();
if ("bye".equalsIgnoreCase(echo)) {flag = false;} else {System.out.println(echo);
}
} while (flag);
// 资源开释
socketPrintStream.close();
socketBufferedReader.close();}
}
服务端代码:
/**
* @author jack
*/
public class Server {public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(2000);
System.out.println("服务器准备就绪...");
System.out.println("服务器信息:" + server.getInetAddress() + "P:" + server.getLocalPort());
// 期待客户端连贯
for (; ;) {
// 失去客户端
Socket client = server.accept();
// 客户端构建异步线程
ClientHandler clientHandler = new ClientHandler(client);
// 启动线程
clientHandler.start();}
}
/**
* 客户端音讯解决
*/
private static class ClientHandler extends Thread {
private Socket socket;
private boolean flag = true;
ClientHandler(Socket socket) {this.socket = socket;}
@Override
public void run() {super.run();
System.out.println("新客户端连贯:" + socket.getInetAddress() + "P:" + socket.getPort());
try (// 失去打印流,用于数据输入;服务器回送数据应用
PrintStream socketOutput = new PrintStream(socket.getOutputStream());
// 失去输出流,用于接收数据
BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
do {
// 服务器拿到拿到一条数据
String str = socketInput.readLine();
if ("bye".equalsIgnoreCase(str)) {
flag = false;
// 回送
socketOutput.println("bye");
} else {
// 打印到屏幕。并回送数据长度
System.out.println(str);
socketOutput.println("服务器收到了, 你发送的长度为:" + str.length());
}
} while (flag);
} catch (Exception e) {System.out.println("连贯异样断开");
} finally {
// 连贯敞开
if (socket != null) {
try {socket.close();
} catch (IOException e) {e.printStackTrace();
}
}
}
System.out.println("客户端已退出:" + socket.getInetAddress() + "P:" + socket.getPort());
}
}
}
运行后果:
报文、协定、Mac 地址、IP、端口
报文段
- 报文段是指 TCP/IP 协定网络传输过程中,起着路由导航作用。
- 用于查问各个网络路由网段、IP 地址、替换协定等 IP 数据包。
- 报文在传输过程中会一直地封装成分组、包、帧来传输。
传输协定
- 协定顾名思义,一种规定,束缚。
- 约定大于配置,在网络传输中仍然实用;网络的传输流程是很强壮的稳固的,得益于根底的协定形成。
- 简略来说:A -> B 的传输数据,B 能辨认,反之 B -> A 的传输数据 A 也能辨认,这就是协定。
Mac 地址
- Media Access Control 或者 Medium Access Control。
- 意译为媒体访问控制,或称为物理地址、硬件地址。
- 用来定义
网络设备
的地位。
- 通常被固化在每个以太网网卡(NIC,Network Interface Card)。MAC(硬件)地址长 48 位(6 字节),采纳十六进制格局。
- 比方:44-45-53-54-00-00。
IP 地址
- 互联网协议地址(Internet Protocol Address)。
- 是调配给网络上应用网际协议的设施的数字标签。
- 常见的 IP 地址分为
IPv4
,IPv6
。 - IP 地址由 32 位二进制数组成,常以 XXX.XXX.XXX.XXX 模式呈现,每组 XXX 代表小于或等于 255 的 10 进制数。
- IP 地址分为 A、B、C、D、E 五大类,其中 E 类属于非凡保留地址。
IP 地址 – IPv4
- 总数量:4,294,967,296 个(即 232):42 亿个;最终于 2011 年 2 月 3 日用尽。
- 如果主机号都是 1,那么这个地址为间接播送地址。
- IP 地址 “255.255.255.255” 为受限播送地址。
IP 地址 – IPv6
- 总共有 128 位长,IPv6 地址的表达形式,个别采纳 32 个十六进制。
- 由两个逻辑局部组成:一个 64 位的网络前缀和一个 64 位的主机地址,主机地址通常依据物理地址主动生成,叫做 EUI-64。
- 2001:0db8:85a3:0000:1319:8a2e:0370:7344
- IPv4 能够转换为 IPv6,但 IPv6 不肯定能转换为 IPv4。
端口
- 如果把 IP 地址比做一间房子,端口就是出入这间房子的门或者窗户。
- 外界的信息飞到不同窗户也就是给不同的人传递信息。
- 0-49151 号端口都是非凡端口。
- 计算机之间按照互联网传输层 TCP/IP 协定的协定通信,不同协定都对应不同的端口。
- 49152 到 65535 号端口属于“动静端口”范畴,没有端口能够被正式占用。