Android基础入门教程——7.6.1 Socket学习网络基础准备

Android基础入门教程——7.6.1 Socket学习网络基础准备

标签(空格分隔): Android基础入门教程


本节引言:

为了照顾没学过Java Socket的初学者,或者说捋一捋Android开发中涉及到的网络协议相关的概念,

毕竟面试的时候,面试官来了句给我说下网络协议有几层?那么IP协议在哪层?Socket是什么鬼?

分哪几种?TCP和UDP协议又在哪层?有什么区别…嗯,这…所以学习本节概念性的理论还是很有

必要的!那么话不多说,开始本节内容~


1.OSI七层网络模型浅析

当然,我们不是专业搞网络工程的,只要知道有哪些层,大概是拿来干嘛的就可以了!

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

  • 物理层(Physical):设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的

    环境。可以理解为网络传输的物理媒体部分,比如网卡,网线,集线器,中继器,调制解调器等!

    在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,这一层的单位是:bit比特

  • 数据链路层(Datalink):可以理解为数据通道,主要功能是如何在不可靠的物理线路上进行

    数据的可靠传递,改层作用包括:物理地址寻址,数据的成帧,流量控制,数据检错以及重发等!

    另外这个数据链路指的是:物理层要为终端设备间的数据通信提供传输媒体及其连接。媒体是

    长期的,连接是有生存期的。在连接生存期内,收发两端可以进行不等的一次或多次数据通信。

    每次通信都要经过建立通信联络和拆除通信联络两过程!这种建立起来的数据收发关系~

    该层的设备有:网卡,网桥,网路交换机,另外该层的单位为:

  • 网络层(Network):主要功能是将网络地址翻译成对应的物理地址,并决定如何将数据从发

    送方路由到接收方,所谓的路由与寻径:一台终端可能需要与多台终端通信,这样就产生的了

    把任意两台终端设备数据链接起来的问题!简单点说就是:建立网络连接和为上层提供服务!

    该层的设备有:路由!该层的单位为:数据包,另外IP协议就在这一层!

  • 传输层(Transport):向上面的应用层提供通信服务,面向通信部分的最高层,同时也是

    用户功能中的最低层。接收会话层数据,在必要时将数据进行分割,并将这些数据交给网络

    层,并且保证这些数据段有效的到达对端!所以这层的单位是:数据段;而这层有两个很重要

    的协议就是:TCP传输控制协议UDP用户数据报协议,这也是本章节核心讲解的部分!

  • 会话层(Session):负责在网络中的两节点之间建立、维持和终止通信。建立通信链接,

    保持会话过程通信链接的畅通,同步两个节点之间的对话,决定通信是否被中断以及通信中断时

    决定从何处重新发送,即不同机器上的用户之间会话的建立及管理!

  • 表示层(Presentation):对来自应用层的命令和数据进行解释,对各种语法赋予相应

    的含义,并按照一定的格式传送给会话层。其主要功能是”处理用户信息的表示问题,如编码、

    数据格式转换和加密解密,压缩解压缩”等

  • 应用层(Application):OSI参考模型的最高层,为用户的应用程序提供网络服务。

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

好的上面我们浅述了OSI七层网络模型,下面总结下:

OSI是一个理想的模型,一般的网络系统只涉及其中的几层,在七层模型中,每一层都提供一个特殊

的网络功能,从网络功能角度观察:

  • 下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,

    即以节点到节点之间的通信为主

  • 第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;
  • 上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。

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

——以上内容参考自:OSI七层模型详解


2.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等)来传送数据。


3.TCP/UDP区别讲解

好吧,前两点侃侃而谈,只是给大家普及下OSI七层模型和TCP/IP四层模型的概念,接下来要讲的是

和我们Socket开发相关的一些概念名词了!

1)IP地址

2)端口

1. 用于区分不同的应用程序

2. 端口号的范围为0-65535,其中0-1023未系统的保留端口,我们的程序尽可能别使用这些端口!

3. IP地址和端口号组成了我们的Socket,Socket是网络运行程序间双向通信链路的终结点,

是TCP和UDP的基础!

4. 常用协议使用的端口:HTTP:80,FTP:21,TELNET:23

3)TCP协议与UDP协议的比较:

TCP协议流程详解:

首先TCP/IP是一个协议簇,里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议,

因为TCP,IP协议是两个很重要的协议,就用他两命名了。

下面我们来讲解TCP协议和UDP协议的区别:

TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,即在收发数据钱

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

三次握手

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

在Socket编程中,这一过程由客户端执行connect来触发,具体流程图如下:

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

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

  • 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位

    SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求

    ,Server进入SYN_RCVD状态。

  • 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK

    置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则

    连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以

    开始传输数据了。

四次挥手

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

在Socket编程中,这一过程由客户端或服务端任一方执行close来触发,具体流程图如下:

  • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入

    FIN_WAIT_1状态

  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,

    一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

  • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK

    状态。

  • 第四次挥手: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把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

相比TCP就是无需建立链接,结构简单,无法保证正确性,容易丢包

——上述内容部分摘自:

TCP/IP三次握手与四次挥手

TCP和UDP的区别(转)


4.Java中对于网络提供的几个关键类:

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

  • InetAddress

    用于标识网络上的硬件资源

  • URL

    统一资源定位符,通过URL可以直接读取或者写入网络上的数据

  • Socket和ServerSocket

    使用TCP协议实现网络通信的Socket相关的类

  • Datagram

    使用UDP协议,将数据保存在数据报中,通过网络进行通信

本节我们只介绍前两个类,Socket与Datagram到TCP和UDP的章节再讲解!

~InetAddress的使用例子

示例代码

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);
    }
}

运行结果图

~URL:这个就不用说了吧,忘了可以看会前面Http协议讲解那里~


本节小结:

本节全是概念,看起来可能够呛的是把,不过看不懂也没关系,知道七层模型每层叫

什么,大概拿来干嘛,还有TCP三次握手和四次挥手,就可以了!当然,这只是为了

应付面试~实际开发我们哪会纠结这个…直接Socket是吧~嗯,下节我们就来开始学习

Android中的Socket通信~谢谢~

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 20:26:59

Android基础入门教程——7.6.1 Socket学习网络基础准备的相关文章

2015年最新Android基础入门教程目录(完结版)

2015年最新Android基础入门教程目录(完结版) 标签(空格分隔): Android基础入门教程 前言: 关于<2015年最新Android基础入门教程目录>终于在今天落下了帷幕,全套教程 共148节已编写完毕,附上目录,关于教程的由来,笔者的情况和自学心得,资源分享 以及一些疑问等可戳:<2015最新Android基础入门教程>完结散花~ 下面是本系列教程的完整目录: 第一章:环境搭建与开发相关(已完结 10/10) Android基础入门教程--1.1 背景相关与系统架构

2015年最新Android基础入门教程目录(临时版)

2015年最新Android基础入门教程目录(临时版) 标签(空格分隔): Android基础入门教程 前言: 嗯,昨晚又给人盗号了,博客上被发表了十几篇黄贴-然后目录给管理误删了,再发一次 后来协商后发现实被设密保问题了,建议各位用csdn的朋友密保自己设置一波~ 密保问题已修改回来了,应该不会再被盗号了-人怕出名猪怕壮哈~下次如果发现博客被封 告知下小猪,如何很急的话可以先到w3c鸟巢菜鸟教程上看Android基础入门教程 经过站长FK进行排版的,可能阅读体验会比csdn好很多!内容基本是同

Android基础入门教程——2.3.1 TextView(文本框)详解

Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextVie

Android基础入门教程——7.6.4 基于UDP协议的Socket通信

Android基础入门教程--7.6.4 基于UDP协议的Socket通信 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家带来Socket的最后一节:基于UDP协议的Socket通信,在第一节中我们已经详细地 比较了两者的区别,TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行 数据传输,如果你学了前两节TCP的,传输前先开服务端,accept,等客户端接入,然后获得 客户端socket然后进行IO操作,而UDP则不用,UDP以数据报作为数据的传输载体,

Android基础入门教程——7.6.3 基于TCP协议的Socket通信(2)

Android基础入门教程--7.6.3 基于TCP协议的Socket通信(2) 标签(空格分隔): Android基础入门教程 本节引言: 上节中我们给大家接触了Socket的一些基本概念以及使用方法,然后写了一个小猪简易聊天室的 Demo,相信大家对Socket有了初步的掌握,本节我们来学习下使用Socket来实现大文件的断点续传! 这里讲解的是别人写好的一个Socket上传大文件的例子,不要求我们自己可以写出来,需要的时候会用 就好! 1.运行效果图: 1.先把我们编写好的Socket服务

Android基础入门教程——7.6.2 基于TCP协议的Socket通信(1)

Android基础入门教程--7.6.2 基于TCP协议的Socket通信(1) 标签(空格分隔): Android基础入门教程 本节引言: 上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket 通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务 端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧! 1.什么是Socket? 2.Socket通信模型: Socket通信

Android基础入门教程——4.2.3 Service精通

Android基础入门教程--4.2.3 Service精通 标签(空格分隔): Android基础入门教程 本节引言: 本节,我们继续来研究Service(服务)组件,本节将会学习下Android中的AIDL跨进程通信的一些 概念,并不深入到源码层次,暂时知道是什么,会用即可!开始本节内容~ 本节对应官方文档:Binder 1.Binder机制初涉 1)IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译: IBinder是远程对象的基本接口,是饿了高性能而设计的轻量级

Android基础入门教程——7.5.6 WebView处理网页返回的错误码信息

Android基础入门教程--7.5.6 WebView处理网页返回的错误码信息 标签(空格分隔): Android基础入门教程 本节引言: 嘿嘿,假如你们公司是做HTML5端的移动APP的,就是通过WebView来显示网页的,假如你访问的网页 不存在,或者其他错误,报404,401,403,30X等错误的状态码,如果直接弹出WebView默认的错误 提示页面,可能显得不那么友好,我们可以重写WebViewClient的onReceivedError()方法来实现我们 想要的效果,一般的做法有两

Android基础入门教程——4.2.2 Service进阶

Android基础入门教程--4.2.2 Service进阶 标签(空格分隔): Android基础入门教程 本节引言 上节我们学习了Service的生命周期,以及两种启动Service的两种方法, 本节继续来深入了解Service中的IntentService,Service的使用实例: 前台服务与轮询的实现! 1.IntentService的使用 在上一节后我们已经知道了如何去定义和启动Service,但是如果我们直接把 耗时线程放到Service中的onStart()方法中,虽然可以这样做