Java进阶-网络编程(一)

在学习过程中,网络编程时永远绕不开的一个点。

OSI七层网络模型

开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于ISO/IEC 7498-1。OSI模型

网路模型图如下:

七层网络模型并不是一个必须遵循的标准,只是一个在制定标准时所使用的概念性框架。

应用层:提供为应用软件而设的界面,以设置与另一应用软件之间的通信。如HTTP,HTTPS,FTP,TELNET,SSH等。
表示层:把数据转换为能与接收者的系统格式兼容并适合传输的格式。

TCP/IP协议族

互联网协议族(英语:Internet Protocol Suite,缩写IPS)是一个网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构。它常被通称为TCP/IP协议族(英语:TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP[2]。因为该协议家族的两个核心协议:TCP(传输控制协议)和IP(网际协议),为该家族中最早通过的标准。

TCP/IP提供点对点的链接机制,将数据封装、定址、传输、路由以及在目的地如何接收,都加以标准化。它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。

TCP/IP协议分为4层:应用层、传输层、网络层、网络接口层。
应用层:上层应用可以直接使用的高级协议,如http、ftp,数据从程序中被编码成标准的协议格式,之后传递到下一层。
传输层:定义数据传输的协议,解决端到端可靠性和保证数据按照正确的顺序达到。
网络层:定义不同网络类型间通信协议(IP协议用于实现网络路由、ICMP检查网络通畅性、ARP获取设备MAC地址)
网络接口层:数据包从一个设备的网络层传输到另外一个设备的网络层的方法

TCP协议

TCP协议的运行可以划分为三个阶段:创建连接、数据传送、连接终止。

TCP通过三次握手创建一个连接。过程如下:

1、客户端向服务端发送SYN(是TCP/IP建立连接时使用的握手信号)给服务端,客户端把这段连接的序号设定为随机数A,客户端进入SYN_SEND状态等待服务器确认。
2、服务端为一个合法的SYN回传SYN/ACKACK(确认字符)的确认码为A+1,SYN/ACK本身产生一个随机的序号B,服务端进入SYN_RECV状态。
3、客户端收到服务端消息后,再次发送一个ACK,当服务端收到该ACK时,完成了三次握手,进入创建拦截状态。此时包的序号被设定为收到的确认号A+1,而响应号则为B+1。客户端服务端都进入ESTABLISHED状态。

如图:

  • 如果服务端在发送SYN/ACK给客户端后,客户端掉线,那么服务端会重发SYN/ACK,Linux默认5次,每次间隔2的N次方秒,如果一直未收到客户端发送的ACK那么此次TCP连接超时。

TCP断开链路通过四次挥手断开连接:

1、主机1(服务端或者客户端)生成随机数向另一个主机2发送FIN报文,主机1进入FIN_WAIT状态,表示没有数据需要发送
2、主机2收到FIN报文,向主机1回复ACK报文,随机数+1,主机1进入FIN_WAIT_2状态,
3、主机2再次向主机1发送FIN报文,请求关闭连接,主机2进入LAST_ACK状态
4、主机1收到主机2FIN报文,向主机1发送ACK报文,然后主机1进入TIME_WAIT状态,主机2收到主机1的ACK报文后关闭连接,此时主机1等待2msl后未收到回复,正常关闭。

主机1 –> 主机2 :主机1进入FIN_WAIT状态
主机2 –> 主机1 :主机1收到后进入FIN_WAIT_2状态
主机2 –> 主机1 :主机2进入LAST_ACK状态
主机1 –> 主机2 :主机1进入TIME_WAIT状态,2msl后未收到回复关闭,主机2收到报文后直接关闭

流量控制
流量控制用来避免主机分组发送得过快而使接收方来不及完全收下,一般由接收方通告给发送方进行调控。
TCP使用滑动窗口协议实现流量控制。接收方在“接收窗口”域指出还可接收的字节数量。发送方在没有新的确认包的情况下至多发送“接收窗口”允许的字节数量。接收方可修改“接收窗口”的值。

拥塞控制
拥塞控制是发送方根据网络的承载情况控制分组的发送量,以获取高性能又能避免拥塞崩溃(congestion collapse,网络性能下降几个数量级)。这在网络流之间产生近似最大最小公平分配。

UDP协议

用户数据报协议(英语:User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报的传输层协议,正式规范为RFC 768。
在TCP/IP模型中,UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)。

因为UDP消耗资源少,处理速度快,所以通常音频、视频等数据在传送时采用UDP较多,因为即使丢失少量的包,并不会产生较大的影响。
因为UDP在传输层无法保证数据的可靠性,需要在应用层来实现可靠性。

要实现UDP的可靠性需要在应用层实现:确认机制、重传机制、窗口确认机制,在发送方面需要实现包的分片、包确认、包重发,在接收方面需要实现包的调序、包的序号确认

开源的UDP实现可靠数据传输有:RUDP、RTP、UDT。
据说QQ部分消息传输采用的是UDP为主,TCP为辅。游戏王者荣耀也是。

参考:

  • 网络传输协议
  • 传输控制协议
  • 通俗大白话来理解TCP协议的三次握手和四次分手
  • 用户数据报协议