网络-----》TCP协议和OSI模型
- 计算机网络定义:
计算机网络是通过传输介质、通信设施和通信协议,将分散在不同点的计算机设备互联起来实现资源共享和数据传输的系统。
网络编程就是编写程序使联网的两个或者多个设备直接进行传输。 - 国际标准组织提出网络开发互联模型OSI(open System Interconnection),将网络划分成7层OSI:物理层(Physical)、数据链路层(Data Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Presentation)、应用层(Application)
- 网络分层的原则:
(1)根据功能进行抽象分层,每个层次所要实现的功能或服务均有明确的规定。
(2)每层功能的选择应有利于标准化。
(3)不用的系统分成相同的层次,对等层次具有相同功能。
(4)高层使用下层提供的服务时,下层服务的实现是不可见的。
(5)层的数目要适当,层次太少功能不明确,层次太多体系结构过于庞大。 - OSI模型各层的作用:
应用层 (Application) ----》 ftp\http\smtp "hello,你好 ",为应用层提供服务
表示层(Presentation) ----》 对应用层的数据进行封装,校验,加密等操作
会话层(Session) ----》 在于对通信开始、结束、异常中断进行处理
传输层(Transport) -----》 保持通信双方的端对端的联系(端口)
网络层(Network) ----》 在于通信双方主机与主机的联系 (IP)
数据链路层(Data Link)-----》 在于保证网络中相邻节点的可靠通信、物理地址(Mac地址)------》arp.rap(地址转换协议)
物理层(Physical) -----》 数据以bit流的形式在通信介质上传输
TCP/IP协议:
五层、四层协议
TCP/IP模型的介绍:
应用层
应用:各种应用程序、APP
特性:机械特性、电气特性、功能特性、规程特性
协议:FTP、SMTP、HTTP
- FTP(File Transfer Protocol):文件传输协议<端口:21>–》减少或者消除不同操作系统下处理文件的不兼容性
- HTTP(HyperText transfer Protocol):超文本传输协议 <端口:80>
- SMTP(Simple Mail transfer Protocol):简单邮件协议 <端口:25>用于发送邮件
传输层
数据单元:数据段 - TCP(Transmission Control Protocol)传输控制协议提供可靠的连接服务,进行数据传输之前需要建立连接(三次握手),建立连接后才能通信,通信结束断开连接(四次挥手)
- UDP(User Datagram Protocol)用户数据报协议,发送数据前不需要建立连接
网络层
应用:路由器、交换机
数据单元:数据包
- IP(IPv4/IPV6)(Internet Protocol)网络互连协议
- ARP(Address Resolution Protocol)地址解析协议,实现通过IP地址得到物理地址
- RARP(Reverse Address Resolution Protocol)逆地址解析协议,实现通过物理地址得到IP地址
- ICMP(Internet Control Message Protocol)网络控制报文协议,TCP/IP协议族的一个子协议,用于在IP主机,路由器之间传递控制消息
物理层
应用:网线
数据单元:比特
- 网络基于C/S模型 --》客户端 (Client)和服务端(Server)
- socket(IP+端口)可以确定主机上某一个应用
- IP+端口相关的一个类:InetSocketAddress
TCP中交互步骤:
客户端 | 服务器端 |
---|---|
bind(端口) | |
connect(连接 IP+端口) | |
accept(返回和客户端连接的实例) | |
read/write(读写) | read/write(读写) |
close(关闭资源) | close(关闭资源) |
TCP协议:编程联系
注意:客户端连接服务器端时,服务器端必须先启动
客户端代码:
public static void main(String[] args) throws IOException {
//创建socket实例
Socket socket = new Socket();
//连接服务器 192.168.31.135
socket.connect(new InetSocketAddress("127.0.0.1", 8888));
// System.out.println("客户端连接上服务器了");
//发送消息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello\n".getBytes());
//关闭资源
socket.close();
}
服务端代码
public static void main(String[] args) throws IOException {
//创建serversocket的实例
ServerSocket serverSocket = new ServerSocket();
//绑定端口
serverSocket.bind(new InetSocketAddress(8888));
// System.out.println("服务端启动了");
//监听并获得socket,该方法会阻塞
Socket socket = serverSocket.accept();
// System.out.println(socket.getRemoteSocketAddress()+" 客户端连接上了");
//可以进行读写操作
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = reader.readLine())!= null) {
System.out.println(msg);
}
//关闭资源
reader.close();
socket.close();
serverSocket.close();
}
**TCP头部信息字段释义:
源端口号以及目的端口号:
各占2个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程一般来讲,通过端口号和IP地址,可以唯一确定一个TCP连接,在网络编程中,通常被称为一个socket接口。
序号:
占4字节,用来标识从TCP发送端向TCP接收端发送的数据字节流,表示该分段在发送方的数据流中的位置用来保证到大数据顺序的编号。
确认序号:
占4字节,包含发送确认的一端所期望收到的下一个序号,相当于是对对方所发送的并被接收方所正确接收的数据的确认,因此,确认序号应该是上次已经成功收到数据字节序号加1.
序号和确认序号共同作用于TCP服务中的确认、差错控制。
数据偏移:
占4位,用于指出TCP首部长度,相当于给出数据在数据段中的开始位置,若不存在选项,则这个值为20字节, 数据偏移的最大值为60字节。
保留字段:
占6位,为将来的应用而保留,目前置为0.
标志位:
URG(紧急) : 为1时表明紧急指针字段有效 A
CK(确认):为1时表明确认号字段有效
PSH(推送):为1时接收方应尽快将这个报文段交给应用层
RST(复位):为1时表明TCP连接出现故障必须重建连接
SYN(同步):在连接建立时用来同步序号
FIN (终止): 为1时表明发送端数据发送完毕要求释放连接
接收窗口:
占2个字节,用于流量控制和拥塞控制,表示当前接收缓冲区的大小。
在计算机网络中,通常是用接收方的接收能力的大小来控制发送方的数据发送量。
TCP连接的一端根据缓冲区大小确定自己的接收窗口值,告诉对方,使对方可以确定发送数据的字节数。
通常使用可变的滑动窗口协议来进行流量控制。
校验和:
占2个字节,范围包括首部和数据两部分,对首部和数据进行校验。
通常将所有16b以补码形式相加,然后再对相加和取补,正常情况下应为0.
选项是可选的,默认情况是不选
紧急指针
给出从当前***到紧急数据位置的偏移量。