一、计算机网络
1、 基础知识
计算机网络是通过传输介质,通信设施和通信协议,将分散在不同点的计算机设备互联起来实现资源共享和数据传输系统(计算机技术+通信技术)
网络编程就是编写程序是两个或多个设备直接进行传输
OSI 国际标准组织提出网络开发互联模型(open System Interconnect):
将网络划分为七层:物理层(Physical)、数据链路层(DataLink)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Presentation)、应用层(Application)
作用分别为:
七层模型 | 作用 |
---|---|
1.应用层 | FTP/HTTP/SMTP 可以发送“hello world!” |
2.表示层 | 对应用层的数据进行封装、校验、加密等操作 |
3.会话层 | 对通信的开始、结束、异常、中断进行处理 |
4.传输层 | 保持通信双方的端对端的联系(端口) |
5.网络层 | 通信双方主机与与主机的联系(IP) |
6.数据链路 | 保证网络中相邻接点的可靠通信、物理地址(MAC地址) |
7.物理层 | 数据以bit流的形式在通信介质上传输 |
如果A和B相互通信的话:A → 网关(路由器) → 基站 → 网关 → B
2、 TCP/IP模型的介绍:
应用层 |
---|
传输层 |
网络层 |
网络接口层 |
1.应用层:各种应用程序、app
协议:FTP/SMTP/HTTP/Telnet
FTP(file transfer protocol):文件传输协议(端口:21),减少或者消除不同操作系统下处理文件的不兼容性
HTTP(HyperText transfer protocol):超文本传输协议(端口:80)
SMTP(Simple Mail transfer protocol):简单邮件协议(端口:25)用于发送邮件
Telnet:远程登录
2.传输层:
TCP:(Transmission Control Protocol) 传输控制协议,
提供可靠的数据通信,在进行数据传输之前需要建立连接(三次握手),建立连接之后才能通信,通信结束后断开连接(四次挥手)
UDP:(User Datagram Protocol)
无连接的用户数据协议,发送数据前不需要建立连接 ,只是把称为数据报的分组从一台主机发送到另一台主机,但并不保证该数据的可靠性。
3.网络层
应用:路由器、交换机
数据单元:数据包
IP(IPV4、IPV6)(Internet Protocol)网络互连协议
ARP协议(Address Resolution Protocol):地址解析协议
RARP协议(Reverse Address Resolution Protocol):逆地址解析协议,实现通过物理地址得到IP地址
ICMP(Internet Control Message Protocol):网络控制报文协议
TCP/IP协议族的一个子协议,用于在IP主机,路由器之间传递控制消息
4.网络接口层
①数据链路层
数据单元:帧
②物理层
应用:网线
数据单元:比特
3、OSI模型和TCP/IP对比图以及相应的协议
4、服务器、客户端编程
网络基于C/S模型,(客户端Client、服务器Server)
TCP中交互步骤:socket(IP+端口)-》8888
服务端: | 客户端: |
---|---|
创建ServerSocket实例 | 创建Socket实例 |
bind(绑定端口) | |
connect(连接 IP+端口) | |
listen(监听状态) | |
accept(返回和客户端连接的实例) | |
read、write(读写) | read、write(读写) |
close(关闭资源) | close(关闭资源) |
注意:客户端连接服务端时,服务端必须先启动
服务器端代码:
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("127.0.0.1", 8888)); //绑定IP和端口号
System.out.println("服务器已经启动...,等待客户端连接...");
Socket socket = serverSocket.accept();
int localPort = socket.getLocalPort(); //获得当前端口号
System.out.println("当前服务器端口为:" + localPort);
//BufferReader从字符输入流中读取文本
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = reader.readLine()) != null ) { //循环读
System.out.println(msg);
}
// serverSocket.close();
}
}
客户端代码:
public class TCPClient {
public static void main(String[] args) throws IOException {
//创建socket实例
Socket socket = new Socket();
//连接服务器 127.0.0.1 可能会抛出IO异常
socket.connect(new InetSocketAddress("127.0.0.1",8888));
System.out.println("客户端已经连接上服务器了");
System.out.println("客户端准备发送消息:");
//通过字节输出流写入消息,发送消息
OutputStream outputStream = socket.getOutputStream();
while (true) {
Scanner scanner = new Scanner(System.in);
String a = scanner.nextLine();
outputStream.write((a+"\n").getBytes()); //客户端要实时发消息,必须加换行
}
//socket.close(); //关闭套接字
}
}
运行示例:
先运行Server端:
再运行Client端:
客户端发送消息:
服务端接收消息:
5、TCP头部信息字段释义
- 源端口号以及目的端口号
各占2个字节(16比特),端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程,
通过端口号和IP地址,可以唯一确定一个TCP连接,在网络编程中,通常被称为一个socket接口。 - 序列号
占4字节(32比特),用来标识从TCP发送端向TCP接收端发送的数据字节流。 - 确认号
占4字节(32比特),下一个期望接收的TCP分段号,相当是确认对方发送的且被正确接收的分段,
因此,确认序号应该是上次已经成功收到数据字节序号加1. - 数据偏移(报头长度)
占4位,用于指出TCP首部长度,若不存在选项,则这个值为20字节,
数据偏移的最大值为60字节。 - 保留字段
占6位,为将来的应用而保留,值暂时置为0 - 标志位(编码位)
URG(紧急) : 为1时表明紧急指针字段有效,通知系统此报文中有紧急数据
ACK(确认):为1时表明确认号字段有效
PSH(推送):为1时请求急迫操作,分段一到立即发送到应用程序,不用等到接受缓冲区满时才发送给应用层
RST(复位):为1时表明TCP连接出现故障必须重建连接,也可以用于拒绝非法的分段或拒绝连接请求
SYN(同步):与ACK合用来建立TCP连接。在连接建立时用来同步序号。
如SYN=1,ACK=0;表示连接请求。SYN=1,ACK=1;则表示同意建立连接
FIN (终止): 为1时表明发送端数据发送完毕要求释放连接,但接收方仍可继续接收发送方此前发送的数据。 - 接收窗口
占4个字节,用于流量控制和拥塞控制,表示当前接收方缓冲区的大小。
在计算机网络中,通常是用接收方的接收能力的大小来控制发送方的数据发送量。
TCP连接的一端根据缓冲区大小确定自己的接收窗口值,通知对方,使对方可以确定发送数据的字节数。 - 校验和
占4个字节,校验范围包括首部和数据两部分。选项是可选的,默认情况是不选。
通过将所有16位字以补码形式相加,然后再对相加和取补。 - 紧急指针
占4个字节,给出从当前顺序号到紧急数据位置的偏移量 - 选项
长度可变,TCP只规定了一种选项,即最大报文段长度(MSS) - 填充
当任选字段商都不足32位时,进行填充 - 数据
来自高层,即应用层的协议数据。