Android Socket TCP/IP UDP

本章节开始,我们将学习网络底层的东西,比如 TCP/IP 、 UDP 和 Socket 等

本章节的知识点不要全部都记住,只要记住以下几点

  1. TCP 协议的建立连接三次握手,断开连接四次挥手

  2. TCP 是面向连接传输的,可以保证数据一定送达,UDP 是无连接的

OSI 七层网络模型

OSI 七层网络模型(从下往上) 依次是

  • 物理层(Physical) :设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的 环境。可以理解为网络传输的物理媒体部分,比如 网卡,网线,集线器,中继器,调制解调器 等! 在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,这一层的单位是: bit比特

  • 数据链路层(Datalink) :可以理解为数据通道,主要功能是如何在不可靠的物理线路上进行 数据的可靠传递,改层作用包括:物理地址寻址,数据的成帧,流量控制,数据检错以及重发等! 另外这个 数据链路指的是 :物理层要为终端设备间的数据通信提供传输媒体及其连接。媒体是 长期的,连接是有生存期的。在连接生存期内,收发两端可以进行不等的一次或多次数据通信。 每次通信都要经过建立通信联络和拆除通信联络两过程!这种建立起来的 数据收发关系 ~ 该层的设备有: 网卡,网桥,网路交换机 ,另外该层的单位为: 帧

  • 网络层(Network) :主要功能是将网络地址翻译成对应的物理地址,并决定如何将数据从发 送方路由到接收方,所谓的路由与寻径:一台终端可能需要与多台终端通信,这样就产生的了 把任意两台终端设备数据链接起来的问题!简单点说就是:建立网络连接和为上层提供服务! 该层的设备有: 路由 !该层的单位为: 数据包 ,另外IP协议就在这一层!

  • 传输层(Transport) :向上面的应用层提供通信服务,面向通信部分的最高层,同时也是 用户功能中的最低层。接收会话层数据,在必要时将数据进行分割,并将这些数据交给网络 层,并且保证这些数据段有效的到达对端!所以这层的单位是: 数据段 ;而这层有两个很重要 的协议就是: TCP传输控制协议 与 UDP用户数据报协议 ,这也是本章节核心讲解的部分!

  • 会话层(Session) :负责在网络中的两节点之间建立、维持和终止通信。建立通信链接, 保持会话过程通信链接的畅通,同步两个节点之间的对话,决定通信是否被中断以及通信中断时 决定从何处重新发送,即不同机器上的用户之间会话的建立及管理!

  • 表示层(Presentation) :对来自应用层的命令和数据进行解释,对各种语法赋予相应 的含义,并按照一定的格式传送给会话层。其主要功能是"处理用户信息的表示问题,如编码、 数据格式转换和加密解密,压缩解压缩"等

  • 应用层(Application) :OSI参考模型的最高层,为用户的应用程序提供网络服务。 它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议。此外,该层还负责协调各个应用程序间的工作。应用层为用户提供的服务和协议有:文件服务、目录服务、文件传输服务(FTP)、远程登录服务(Telnet)、电子邮件服务(E-mail)、打印服务、安全服务、网络管理服务、数据库服务等

OSI 是一个理想的模型,一般的网络系统只涉及其中的几层,在七层模型中,每一层都提供一个特殊 的网络功能,从网络功能角度观察:

  • 下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能, 即以节点到节点之间的通信为主

  • 第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;

  • 上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。

简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。

TCP/IP 协议簇 四层模型

TCP/IP 是一组协议的代名词,它还包括许多协议,组成了 TCP/IP 协议簇

TCP/IP协议簇分为四层,IP 位于协议簇的第二层(对应 OSI 的第三层),TCP 位于协议簇的第三层 (对应 OSI 的第四层)

TCP/IP 通讯协议采用了 4 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求

这4层分别为

  • 应用层

    应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP) 网络远程访问协议 ( Telnet) 等

  • 传输层

    提供了节点间的数据传送服务,如传输控制协议 ( TCP ) 和 用户数据报协议 (UDP) 等

    TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收

  • 网络互连层

    负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机 (但不检查是否被正确接收),如网际协议 ( IP )

  • 主机到网络层

    对实际的网络媒体的管理,定义如何使用实际网络来传送数据,如 Ethernet、Serial Line 等

IP 地址

为了实现网络中不同终端的之间的通讯,每个终端都必须有一个唯一的标识,这就是 IP 地址的作用

IP 地址类似于门牌号

端口

端口号 ( port ) 用于区分不同的网络应用程序

端口号的范围为 0-65535,其中 0-1023 未系统的保留端口,自己开发程序尽可能别使用这些端口

IP 地址和端口号组成了一个 Socket,Socket 是网络运行程序间双向通信链路的终结点,是 TCP 和 UDP 的基础

TCP/IP

TCP/IP 是一个协议簇,里面包括很多协议,TCP 和 UDP 只是其中的两个

之所以命名为TCP/IP协议,因为 TCP,IP 协议是两个很重要的协议,于是就用它俩来命名了

TCP

TCP (Transmission Control Protocol,传输控制协议 ) 是面向连接的协议

TCP 在收发数据前需要与对面建立可靠的链接,这也是面试经常会问到的 TCP 的 三次握手 以及 TCP 的 四次挥手

三次握手

建立一个 TCP 连接时,需要客户端和服务端总共发送 3 个包以确认连接的建立

这一过程由客户端执行 connect() 方法来触发,具体流程图如下

  1. 第一次握手

    Client 将标志位 SYN 置为 1,随机产生一个值 seq=J,并将该数据包发送给 Server

    Client进入 SYN_SENT 状态,等待 Server 确认

  2. 第二次握手

    Server 收到数据包后由标志位 SYN=1 知道 Client 请求建立连接,Server 将标志位 SYN 和 ACK 都置为1,ack=J+1,随机产生一个值 seq=K,并将该数据包发送给 Client以确认连接请求

    Server进入 SYN_RCVD 状态

  3. 第三次握手

    Client 收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为1,ack=K+1,并将该数据包发送给 Server

    Server 检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功

    Client 和 Server 进入 ESTABLISHED 状态,完成三次握手

    随后Client与Server之间可以开始传输数据了

四次挥手

指断开一个 TCP 连接时,需要客户端和服务端总共发送 4 个包以确认连接的断开

这个四次挥手的过程由客户端或服务端任一方执行 close() 方法来触发

具体流程图如下

  1. 第一次挥手

    Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送

    Client 进入 FIN_WAIT_1 状态

  2. 第二次挥手

    Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与 SYN 相同, 一个 FIN 占用一个序号)

    Server进入 CLOSE_WAIT 状态

  3. 第三次挥手

    Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送

    Server 进入 LAST_ACK 状态

  4. 第四次挥手

    Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手

当然也有可能是客户端与服务器端同时发起主动关闭请求

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端

而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还 能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即 close,也可以发送一些 数据给对方后,再发送 FIN 报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN 一般都会 分开发送

UDP

UDP (User Datagram Protocol) 用户数据报协议

UDP 是非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上

在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制

在接收端,UDP 把每个消息段放在队列中,应用程序每次从队列中读一个消息段

相比 TCP ,UDP 就是无需三次握手四次挥手,结构简单,但无法保证正确性,容易丢包

Java 对于网络提供的几个关键类

针对不同的网络通信层次,Java 提供的网络功能有四大类

类 说明
InetAddress 用于标识网络上的硬件资源
URL 统一资源定位符,通过 URL 可以直接读取或者写入网络上的数据
Socket
ServerSocket
使用 TCP 协议实现网络通信的 Socket 相关的类
Datagram 使用UDP协议,将数据保存在数据报中,通过网络进行通信

范例

public class InetAddressTest {
    public static void main(String[] args) throws Exception{
        //获取本机InetAddress的实例:
        InetAddress address = InetAddress.getLocalHost();
        System.out.println("本机名:" + address.getHostName());
        System.out.println("IP地址:" + address.getHostAddress());
        byte[] bytes = address.getAddress();
        System.out.println("字节数组形式的IP地址:" + Arrays.toString(bytes));
        System.out.println("直接输出InetAddress对象:" + address);
    }
}

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

♥   简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.