精华内容
下载资源
问答
  • 物理层与层2的媒体接入控制 (Media Access Control,MAC)子层和层3的无线资源控制(Radio Resource Control,RRC)层具有接口。
  • 计算机网络在我们实际项目中可能应用不多,但是学懂它决定了一个人能成长的上限,进来,一起学

    物理层

    物理层的基本概念

    物理层解决如何在各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体

    • 物理层的主要任务:确定与传输媒体接口有关的一些特性

    物理层定义的一些特性

    1. 机械特性:定义物理连接的特性,规定物理连接时所采用的规格,接口形状,引数条目,引脚数量和排列情况
    2. 电气特性:规定传输二进制位时,线路上信号的电压范围,阻抗匹配,传输速率距离限制.
      • 某网络在物理层规定,信号的电平用+10V+15V表示二进制0,用-10V-15V表示二进制的1,电线长度限于15m以内
    3. 功能特性:指明某条线上出现的某一电平表示何种意义,接口部件的信号线用途
      • 描述一个物理层接口引脚处于高电平时的含义
    4. 规程特性:(过程特性)定义各条物理线路的工作规格和时序关系

    1.通信基础

    典型的数据通信模型:

    在这里插入图片描述

    数据通信相关术语:

    • 数据通信的目的:为了传送消息.
    • 数据:传送消息的实体,通常是有意义的符号序列
    • 信号:数据的电气/电磁的表现,是数据在传输过程中的存在形式.
      • 数字信号:代表消息的参数取值是离散的
      • 模拟信号:代表消息的参数取值是连续的.
    • 信源:产生和发送数据的源头
    • 信宿:接受数据的终点.
    • 信道:信号的传输媒.一般用来表示向一个方向传送信号的介质,因此一条通信线路往往包含一条发送信道和一条接受信道(是有方向的)
      • 分类:
        • 按照传输信号可分为:
        1. 模拟信道:传送模拟信号
        2. 数字信道:传送数字信号
        • 按照传输介质:
          1. 无线信道
          2. 有线信道

    三种通信方式:

    从通信双方信息的交互方式看,可以有三种基本方式:

    1. 单工信道:只有一个方向的通信而没有反方向的交互,仅需要一条信道
    2. 半双工通信:通信的双方都可以发送或接受信息,但任何一方都不能同时发送和接受需要两条信道.
    3. 全双工通信:通信双方可以同时发送和接受信息,也需要两条信道

    两种数据传输方式:

    1. 单行传输:速度,费用,适合距离
    2. 并行传输:速度,费用,适合距离.例如:打印机,扫描仪

    单行传输只需要一条信道,并行传输是多条信道同时传输比特流,因此需要多条信道.

    码元

    码元是指用一个固定时长信号波形(数字脉冲),代表不同离散数值的基本波形,是数字通信中数字信号的基本单位,这个时长内的信号称为k进制码元,而该时长称为码元宽度.当码元的离散状态有M个时(M大于2),此时码元为M进制码元.

    1码元可以携带多个比特的信息量.例如,在使用二进制编码时,只有两种不同的码元:一种代表0状态,一种代表1状态.

    速率.波特和带宽

    速率:也叫数据率,是指数据的传输速率,表示单位时间内传输的数据量.可以用码元传输速率信号传输速率表示

    码元传输速率:别名码元速率.波形速率.调制速率.符号速率等.他表示单位时间内数字通信系统所传输的码元个数(也可称为脉冲个数或信号变化的次数),单位是波特.(Baud)1波特表示数字通信系统每秒传输一个码元.这里码元可以是多进制的,也可以是二进制的,但码元速率和进制数无关.(1s传输多少个码元)

    信息的传输速率:别名信息速率.比特率等,表示单位时间内数字通信系统传输的二进制码元个数(即比特数),单位是比特/秒(bit/s).一秒能传输多少个比特.

    关系:假如说一个码元携带n bit的信息,则M Baud的码元传输速率对应的信息传输速率是:n*M bit/s.

    带宽:带宽指的是在单位时间内从网络中的某一点到另一点所能通过的最高数据率,常用来表示网络的通信线路所能传输数据的能力,单位是b/s.

    • 提问那个系统的传输速率更快?

    系统传输的是比特流,通常比较的是信息传输速率.

    2.两个公式

    失真

    在实际信道传输数据过程中,由于带宽受限,有噪声,有干扰,会导致发送信号的波形发生变化就叫失真

    影响失真程度的因素:

    1. 码元的传输速率
    2. 信号传输距离
    3. 噪声干扰
    4. 传输媒体质量

    失真的一种现象-------码间串扰

    码间串扰:接收端收到的信号波形失去了码元之间清晰界限的现象

    在这里插入图片描述

    注意区分信号带宽和信道带宽.

    奈氏准则(奈奎斯特定理)

    奈氏准则:在理想低通(无噪声,带宽受限)条件下,为了避免码间串扰,极限码元传输速率为2w Baud,w是信道带宽,单位是hz

    理 想 低 通 信 道 下 的 极 限 数 据 传 输 率 = 2 W l o g 2 V 注 : W 指 的 是 带 宽 , V 指 的 是 几 种 码 元 / 码 元 的 离 散 电 平 数 目 理想低通信道下的极限数据传输率= 2Wlog_2{V} \\ 注:W指的是带宽,V指的是几种码元/码元的离散电平数目 =2Wlog2V:W,V/

    1. 在任何信道中,码元传输的速率是有上限的.若传输速率超过此上限,就会出现严重的码间串扰,使接收端对于码元的完全正确识别成为不可能
    2. 信道的频带越宽(即能通过的信号高频分量越多),就可以用更高的速率进行码元间的有效传输.
    3. 奈氏准则给出了码元传输速率的限制,但并没有对信息传输速率给出限制.
    4. 由于码元的传输速率受奈氏准则的制约,所以要提高数据的传输速率,就必须使每个码元能够携带更多个比特的信息量,这就需要采用多元制的调制方法.

    做一个题

    在无噪声的情况下,若某通信链路的带宽为3kHz,采用4个相位,每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输率是多少?
    答 : 信 号 有 4 × 4 = 16 种 变 化 ( 调 相 和 调 幅 结 合 在 一 起 ) 最 大 数 据 传 输 率 = 2 × 3 k × 4 = 24 k b / s 答:信号有4×4=16种变化(调相和调幅结合在一起) \\最大数据传输率 = 2×3k×4=24kb/s :4×4=16()=2×3k×4=24kb/s

    香农定理

    噪声存在于所有的电子设备和通信信道中.由于噪声随机产生,它的瞬时值有时会很大,因此噪声会使接收端对码元的判决产生错误.但是噪声的影响是相对的,若信号较强,那么噪声相对较小因此,信噪比就很重要.

    信噪比公式

    信噪比 = 信号的平均功率/噪声的平均功率,常记为S/N,并用分贝(dB)作为度量单位,即:
    信 噪 比 ( d B ) = 10 l o g 10 ( S / N ) 信噪比(dB)= 10 log_{10}{(S/N)} (dB)=10log10(S/N)

    香农定理

    在带宽受限且有噪声的信道中,为了不产生误差,信息的数据传输速率有上限值.
    信 道 的 极 限 数 据 传 输 速 率 = W l o g 2 ( 1 + S / N ) S / N 表 示 信 噪 比 注 意 : 在 香 农 定 理 中 我 们 用 的 是 信 噪 比 , 而 不 是 分 贝 , 如 果 题 目 中 给 出 的 噪 声 是 分 贝 的 化 , 要 使 用 信 噪 比 公 式 进 行 转 化 信道的极限数据传输速率=Wlog_2{(1+S/N)}\\ S/N表示信噪比\\ 注意:在香农定理中我们用的是信噪比,而不是分贝,如果题目中给出的噪声是分贝的化,要使用信噪比公式进行转化 =Wlog2(1+S/N)S/N:,,,使

    1. 信道的带宽或信道中的信噪比越大,则信息的极限传输速率越高
    2. 对一定的传输带宽和一定的信噪比,信息传输速率的上限就确定了
    3. 只要信息的传输速率低于信道的极限传输速率,就一定能找到某种方法实现无差错的传输
    4. 香农定理得出的为极限信息传输速率,实际信道传输速率要比它低不少
    5. 从香农定理可以看出,若信道带宽W或信噪比S/N没有上限(不可能),那么信息传输速率也就没有上限.

    做一道题

    电话系统的典型参数是信道带宽为3000Hz,信噪比为30dB,则该系统最大数据传输速率是多少?
    答 : 30 d B = 10 l o g 10 S / N 求 出 S / N = 1000 信 道 的 极 限 数 据 传 输 速 率 = W l o g 2 ( 1 + S / N ) = 3000 × l o g 2 ( 1 + 1000 ) ≈ 30 k b / s 答:30dB=10log_{10}{S/N} \\求出S/N=1000 信道的极限数据传输速率=Wlog_2{(1+S/N)}=3000×log_2{(1+1000)}≈30kb/s :30dB=10log10S/NS/N=1000=Wlog2(1+S/N)=3000×log2(1+1000)30kb/s

    怎么区别"Nice"和"香浓"

    奈氏准则香农定理
    内忧外患
    带宽受限无噪声条件下,为了避免码间串扰,码元传输速率的上限为2W Baud带宽受限有噪声的条件下的信息传输速率
    理想低通信道下的极限数据传输率信道的极限数据传输率
    要想提高数据率,就要提高带宽/采用更好的编码技术想要提高数据率,就要想办法提高带宽/信噪比
    一般情况下没有噪声条件下使用(表述不全面,要分情况的)一般情况下有噪声条件下使用(表述不全面,要分情况的)

    做一道题

    二进制信号在信噪比为127:1的4kHz信道上传输,最大的数据速率可达到多少?

    这种情况下,我们需要把两个准则都算一下,取最小值.
    答 : 分 析 : 二 进 制 信 号 , 即 是 指 2 种 码 元 信 号 1. 根 据 奈 氏 准 则 公 式 = 2 W l o g 2 V 得 : 最 大 数 据 速 率 = 2 × 4000 × l o g 2 2 = 8000 b / s 2. 根 据 香 农 定 理 = W 10 l o g 2 ( 1 + S / N ) 得 : 最 大 的 数 据 速 率 = 4000 × l o g 2 ( 1 + 127 ) = 28000 b / s 所 以 最 大 数 据 速 率 为 8000 b / s 答:分析:二进制信号,即是指2种码元信号\\ 1.根据奈氏准则公式=2Wlog_2{V}\\ 得:最大数据速率=2×4000×log_2{2}=8000b/s \\2.根据香农定理=W10log_2{(1+S/N)}得: \\最大的数据速率=4000×log_2{(1+127)}=28000b/s \\所以最大数据速率为8000b/s ::,21.=2Wlog2V:=2×4000×log22=8000b/s2.=W10log2(1+S/N):=4000×log2(1+127)=28000b/s8000b/s

    3.编码和调制

    基带信号与宽带信号

    信道;信号的传输媒介.一般用来表示向某一个方向传送信息的介质,因此一条通信线路往往包含一条发送信道和一条接收信道.

    信道的分类:

    1. 根据传输信号分:
      1. 模拟信道:传送模拟信号
      2. 数字信道:传送数字信号
    2. 传输介质分:
      1. 无线信道
      2. 有线信道

    基带信号和宽带信号其实就是信道上传输的两种形式

    信道上传送的信号的分类:

    1. 基带信号:将数字信号1和0直接用两种不同的电压表示,再送到数字信道上传输(基带传输)
      • 基带信号就是来自信源的信号,像计算机输出的代表各种文字或者图像文件的数据信号都属于基带信号.基带信号就是faculty的直接表达了要传输的信息的信号,比如我们说话的声波就是基带信号.(基带信号可以是模拟信号也可以是数字信号,模拟信号比如我们说话的声波,在计算机中计算机发出的是数字信号)
    2. 宽带信号:将基带信号进行调制后形成的频分复用模拟信号,再传送到模拟信道上去传输(宽带传输)
      • 把基带信号经过载波调制后,把信号的频率范围搬移较高的频段以便在信道中传输(即仅能在一段频率范围内能够通过信道)

    在传输距离近时,计算机网络采用基带传输方式(距离近,衰减少,从而信号内容不容易发生改变)

    在传输距离远时,计算机网络曹勇宽带传输方式(距离远,衰减大,经过调制后即使信号变化大,也能过滤出来基带信号)

    编码与调制

    不论我们的数据在传输过程中是怎么样的,只要是要进行传输,我们就需要使用到编码和调制的手段把数据变为信号.

    数字数据------使用数字发送器------>数字信号 :编码的手段

    数字数据------使用调制器------>模拟信号 调制的手段

    模拟数据------使用PCM编码器------>数字信号 :编码的手段

    模拟数据------放大器.调制器------>模拟信号 调制的手段

    数字数据编码为数字信号

    计算机发送的数据都是0101的序列的数字数据,要想数字数据能够在计算机中传输,就需要将数字数据编码为数字信号.

    数字数据的传输用基带传输的方式:既是指基本不改变数字信号的频率 ,直接传输数据

    1. 非归零编码:高1低0,编码容易,但是没有检错功能,且无法判断一个码元的开始和结束,以至于手法双方河南保持同步
    2. 曼彻斯特编码:将一个码元分成两个相等的间隔,前一个间隔为低电平后一个间隔为高电平表示1,码元0则正好相反.也可以采用相反的额规定.该编码的特点是在每一个码元的中间出现电平跳转,位中间的跳转即作为时钟信号(可用于同步,又做数据信号,但它所占的频带宽度是原始基带宽度的两倍),每一个码元都被调成两个电平,所以数据传输速率只有调制速率的1/2.
    3. 差分曼彻斯特编码:同1异0,常用于局域网传输其规则是:若码元为1,则前半个码元的电平相同,若为0,则相反.该编码的特点是,在每个码元的中间,都有一次电平的跳转,可以实现自同步,且抗干扰性强于曼彻斯特编码
    4. 归零编码:信号电平在一个码元之内都要恢复到0的编码方式
    5. 反向不归零编码:信号电平翻转表示0,信号电平不变表示1
    6. 4B/5B编码:比特流中插入额外的比特以打破一连串的0或1,就是5个比特来编码4个比特的数据,之后再传给接收方,因此成为4B/5B.编码效率为80%

    非归零编码.归零编码.反向不归零编码在传输数据时,尤其是传输全0或者全1的数据时,很难保证发送端和接收端的同步,往往需要另外一条信道来建立时钟信号.

    之后的曼彻斯特编码:可以实现自同步,接收端能够自己提取信号,计算每个时钟周期是多少

    数字数据调制为模拟信号

    数字数据调制技术在发送端将数字信号转换为模拟信号,而在接收端将模拟信号还原为数字信号,分别对应于调制解调器的调制和解调过程

    • 调幅
    • 调频
    • 调相
    • 调幅+调相

    模拟信号编码为数字信号

    计算机内部处理的是二进制数据.处理的都是数字音频,所以需要将模拟音频通过采样.量化转换成有限个数字表示的离散序列(即实现音频数字化)

    最典型的例子就是对音频信号进行编码的脉冲调制(PCM),在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存和音乐欣赏,CD.DD以及我们常见的WAV文件中均有应用.它主要包括三步:抽样.量化.编码.

    1. 抽样:对模拟信号周期性进行扫描把时间上连续的信号变成时间上离散的信号.为了使所得的离散信号能无失真的代表被抽样的模拟数据,要使用采样定理进行采样.
      采 样 定 理 : f 采 样 频 率 > = 2 f 信 号 最 高 频 率 采样定理:f_{采样频率}>=2f_{信号最高频率} :f>=2f

    2. 量化:把抽样取得的电平幅值按照一定的分级标准转化为相应的数字值,并取整数,这就把连续的电平幅值转换为离散的数字量

    3. 编码:把量化的结果转换为与之对应的二进制编码

    模拟数据调制为模拟信号

    为了实现传输的有效性,可能需要较高的频率.这种调制方式还可以使用频分复用技术,充分利用带宽资源.在电话机和本地交换机所传输的信号是采用模拟信号传输模拟数据的方式:模拟的声音数据是加载到模拟的载波信号中传输的.

    例如:人使用喇叭

    4.传输介质

    传输媒介也称传输媒体/传输媒介,它就是数据传输系统中在发送设备和接受设备之间的物理通路.

    传输媒体并不是物理层,传输媒体在物理层的下面因为物理层是计算机网络体系结构的第一层,因此有时称传输媒体为第0层.在传输媒体中传输的是信号,但是传输媒体并不知道所传输的信号代表什么意思.但物理层规定了电气特性,因此能够识别所传送的比特流.

    分类:

    1. 导向性传输介质:电磁波被导向沿着固体媒介(铜线/光纤)传播 比如:火车
    2. 非导向传输介质:自由空间,介质可以是空气,真空,海水 比如:飞机

    导向性传输介质----1.双绞线

    它采用一定规则并排胶合,相互绝缘的铜导线组成

    可分为无屏蔽双绞线和屏蔽双绞线

    特点:双绞线价格便宜,是最常用的传输介质之一,在局域网和传统电话网中普遍使用.模拟传输和数字传输都可以使用双绞线,其通信的距离一般为几公里到数十公里,距离太远时,对于模拟传输,要用放大器放大衰减的信号,;对于数字传输,要用中继器将失真的信号整型

    导向性传输介质----2.同轴电缆

    同轴电缆由导体铜质芯线.绝缘层.网状编织屏蔽层和塑料外层构成.按特性阻抗数值的不同通常将同轴电缆分为两类:50Ω同轴电缆和75Ω同轴电缆.其中50Ω同轴电缆主要用于传送基带数字信号,又称为基带同轴电缆,

    在局域网中得到广泛的应用;75Ω同轴电缆主要用于传送宽度信号,又称为宽带同轴电缆,它主要用于有线电视系统

    同轴电缆和双绞线

    由于外导体屏蔽层的作用,同轴电缆抗干扰特性比双绞线好,被广泛应用于传输较高速率的数据其((传输距离**也更远,但价格也更昂贵.

    导向性传输介质----3.光纤

    光纤通信就是利用光导纤维(简称光纤)传递光脉冲来进行通信.有光脉冲表示1,无光脉冲表示0,而可见光的频率大约是 10^8MHz,因此光纤通信系统的带宽远远大于目前其他各种传输媒体的带宽.

    光纤在发送端有光源,可以采用发光二极管或者半导体激光器,他们在电脉冲作用下能产生出光脉冲,在接收端使用光电二极管做成光电检测器,在检测到光脉冲时可还原出电脉冲.

    类别定义光源特点
    单模光纤一种在横向模式直接传输光信号的光纤定向很好的激光二极管衰耗小,社和远距离传输
    多模光纤有多种传输光信号模式的光纤发光二极管易失真,适合近距离传输
    光纤的特点
    1. 传输损耗小,中继距离长,对远距离传输特别经济
    2. 抗雷电和电磁干扰性能好
    3. 无串音干扰,保密性还,也不易被窃听或者窃取数据
    4. 体积小,重量轻

    非导向性传输介质

    分类:

    1. 无线电波:较强穿透能力,可传远距离,广泛用于通信领域
    2. 微波:信号固定方向传播,微波通信频率较高,频段范围宽,因此数据率很高
    3. 红外线.激光.信号固定方向传播

    5.物理层设备

    中继器

    诞生原因:由于存在损耗,在线路上传输的信号功率会逐渐衰减,衰减到一定程度就造成了信号失真,一次会导致接收错误

    中继器功能:

    对信号进行再生和还原,对衰减的信号进行放大,保持与原数据相同,以增加信号传输的距离,延长网络的长度

    中继器的两端

    两端的网络部分是网段,不是子网,适用于完全相同的两类网络的互连,且两个网段速率相同,中继器只将任何电缆段上的数据发送带另一端电缆上,它仅作用于信号的电气部分,并不管数据中是否有错误数据或者不适用网段的数据.

    两端可连接相同的媒体,也可连接不同的媒体

    中继器两端的网段一定要是同一个协议

    5-4-3规则

    网络标准中都对信号的延迟范围作了具体的规定,因而中继器只能在规定的范围内进行,否则会网络故障.

    5个网段 4个媒体 3个端口

    集线器(多口中继器)

    集线器的功能

    对信号进行再生放大转发,对衰减的信号进行方法,接着转发到其他所有(输了输入端口外),处于工作状态的端口上,以增加信号传输的距离,延长网络的长度,不具备信号的定向传送能力,是一个共享的设备.

    集线器不能分隔冲突域------------>连接集线器上的工作主机平分带宽.

    放在最后:番茄自习室加入码:70706E2B,加入进来给自己每天都能专注的时间,一起学习,一起成长,一起高薪

    展开全文
  • 在分析了基于异步传输模式(ATM)技术的无源光接入网(PON)的分层模型以及下行数据流的数据格式的基础上,给出了APON系统网络终端(ONT)物理层的设计原理,以及在设计中所使用到的信元定界、分布式扰码以及可编程门阵列...
  • OSI七协议在网络传输中扮演的角色及功能:7、应用——–电脑的各种数据6、表示 ——– 处理用户信息的表示问题,如编码、数据格式转换和加密解密5、会话——–会话管理、会话流量控制、寻址、寻址4、传输...

    OSI七层协议在网络传输中扮演的角色及功能

    7、应用层——–电脑的各种数据

    6、表示层 ——– 处理用户信息的表示问题,如编码、数据格式转换和加密解密

    5、会话层——–会话管理、会话流量控制、寻址、寻址

    4、传输层——–各种协议(TCP/IP中的TCP协议、Novell网络中的SPX协议和微软的NetBIOS/NetBEUI协议。 )

    3、网络层——–路由器(通过路由选择算法,为报文或分组通过通信子网选择最适当的路径)

    2、数据链路层—-交换机/网桥(负责建立和管理节点间的链路,通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路)

    1、物理层

    ——–集线器/中继器(利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。)



    1、物理层

    物理层协议:
    物理层:(典型设备:中继器,集线器、网线、HUB) 数据单元:比特 (Bit)

    以太网物理层、调制解调器、PLC 、SONET/SDH 、G.709 、光导纤维、 同轴电缆、双绞线

    1.1介绍:

    在OSI参考模型中,物理层(Physical Layer)是参考模型的最低层,也是OSI模型的第一层。
    物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
    物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

    物理层概述:

    这里写图片描述

    1.2、物理层主要功能:

    功能一:为数据端设备提供传送数据的通路
    功能二:传输数据
    这里写图片描述

    【转】OSI第一层物理层介绍

    集线器/中继器介绍:

    1.中继器(repeater)
    中继器是位于第1层(OSI参考模型的物理层)的网络设备。当数据离开源在网络上传送时,它是转换为能够沿着网络介质传输的电脉冲或光脉冲的——这些脉冲称为信号(signal)。当信号离开发送工作站时,信号是规划的,而且很容易辨认出来。但是,当信号沿着网络介质进行传送时, 随着经过的线缆越来越长,信号就会变得越来越弱,越来越差。中继器的目的是在比特级别对网络信号进行再生【放大信号】和重定时,从而使得它们能够在网络上传输更长的距离。
    2.集线器(hub)
    集线器的目的是对网络信号进行再生和重定时。它的特性与中继器很相似(被称为多端口中继器multiport repeater)。HUB是网络中各个设备的通用连接点,它通常用于连接LAN的分段。HUB含有多个端口。每一个分组到达某个端口时,都会被复制到其他所有端口,以便所有的LAN分段都能看见所有的分组。集线器并不认识信号、地址或数据中任何信息模式。
    中继器与集线器的区别在于连接设备的线缆的数量。一个中继器通常只有两个端口,而一个集线器通常有4至20个或更多的端口。

    集线器能够创建于总线方式相同的争用环境,当一台设备进行传输时,集线器上其他的设备都会监听它,并且争取下一次的传输权利。因此,连接在集线器上的设备将平分该集线器所拥有的带宽。并且在同一集线器上的设备属于同一个冲突域。

    2、数据链路层

    数据链路层协议:

    数据链路层: (典型设备: 网卡,网桥,交换机) 数据单元:帧 (Frame)

    ARQ(Automatic Repeat-reQuest )自动重传请求协议,错误纠正协议之一,包括停止等待ARQ 协议和连续ARQ 协议,错误侦测、正面确认、逾时重传与负面确认继以重传等机制。

    停止等待协议:
    CSMA/CD(Carrrier Sense Multiple Access with Collision Detection)载波监听多点接入/碰撞检测协议。总线型网络,协议的实质是载波监听和碰撞检测。载波监听即发数据前先检测总线上是否有其他计算机在发送数据,如暂时不发数据,避免碰撞。碰撞检测为计算机边发送数据边检测信道上的信号电压大小。

    PPP(Point-to-Ponit Protocol)点对点协议面向字节,由三部分组成:一个将IP 数据报封装到串行链路的方法;一个用于建立、配置和测试数据链路连接的链路控制协议

    LCP(Link Control Protocol) :一套网络控制协议NCP 。

    HDLC (High-Level Data Link Control )高级数据链路控制同步网上传输数据、面向比特的数据链路层协议。

    ATM (Asynchronous Transfer Mode )异步传递方式,建立在电路交换和分组交换的基础上的一种面向连接的快速分组交换技术。 “异步”是指将ATM 信元“异步插入”到同步的 SDH 比特流中。如同步插入则用户在每帧中所占的时隙相对位置固定不变。“同步”是指网络中各链路上的比特流都是受同一非常精确的主时钟的控制。Wi-Fi 、WiMAX 、DTM 、令牌环、以太网、FDDI 、帧中继、 GPRS 、 EVDO 、HSPA 、L2TP 、ISDN

    2.1介绍:

    数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。为达到这一目的,数据链路必须具备一系列相应的功能,主要有:如何将数据组合成数据块,在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。

    它规定了以太网的帧操作,该传感器在工艺上将两个特征一致的热电元反向串联或接成差动平衡电路方式,因而能以非接触式检测出物体放出的红外线能量变化 ,数据链路层故障包括由集线器、路由器、网络测试仪提供的关于帧活动和帧错误的统计数据,并将其转换为电信号输出。

    它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。
    数据链路层:是为了提供功能上和规程上的方法,以便建立、维护和释放网络实体间的数据链路 。
    物理链路(物理线路):是由传输介质与设备组成的。原始的物理传输线路是指没有采用高层差错控制的基本的物理传输介质与设备。
    数据链路(逻辑线路):在一条物理线路之上,通过一些规程或协议来控制这些数据的传输,以保证被传输数据的正确性。实现这些规程或协议的硬件和软件加到物理线路,这样就构成了数据链路。从数据发送点到数据接收点(点到点 point to point)所经过的传输途径。
    当采用复用技术时,一条物理链路上可以有多条数据链路。[

    2.2内容:

    数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。为达到这一目的,数据链路必须具备一系列相应的功能,主要有:如何将数据组合成数据块,在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。数据链路控制协议也称链路通信规程,也就是OSI参考模型中的数据链路层协议。链路控制协议可分为异步协议和同步协议两大类。数据链路层的主要协议有:

      (1)点对点协议(Point-to-PointProtocol);

      (2)以太网(Ethernet);

      (3)高级数据链路协议(High-LevelDataLinkProtocol);

      (4)帧中继(FrameRelay);

      (5)异步传输模式(AsynchronousTransferMode)。

    2.3分类:
    数据链路层包含LLC逻辑链路层子层和MAC介质访问控制子层两个子层

    逻辑控制子层 
    

      数据链路层的LLC子层用于设备间单个连接的错误控制,流量控制。与MAC层不同,LLC和物理媒介全无关系。媒介是CSMA/CD的802.3还是802.5的令牌环都没关系。它在LAN中是独立的802.2。在LLC之上的网络层可以是无连接、响应的无连接或面向连接的不同业务。LLC用业务接入点SAP访问上层协议,有了SAP,站点就能在LLC层只用一个接口同时与几个高层协议玩。一个SAP是简单的地址或协议ID,内容则为空的LLC帧。LLC协议数据单元(LLCPDU)即LPDU。它包括:DSAP(目的SAP)/SSAP(源SAP);一个定义吞吐量优先级的控制;和含带数据的信息域。在接收方,DSAP例如协议ID就是消息要被递送的,通常DSAP和SSAP是一样的,因为两端只有在同种协议间才能通信。例如当SAP为AA,代表SNAP(子层接入协议)。SNAP是个非标准化的,或厂商特定的协议,用于接入协议的业务。例如当SAP为06,则代表IP协议;当SAP为FO,代表NetBIOS(网络基本输入/输出协议)。SAP为FF表示广播的Global协议。

      SNAP机制:规范种DSAP都只有一个字节,那不足够区分所有协议了。SNAP就来了,而且它支持在LLC帧上传厂商的协议。这样传递的协议就被放入所谓SNAP帧中了。SNAP”ㄍ酚形遄纸冢前三字节为厂商号,后两字节指示协议。以太网有两种版本:IEEE(802.2、802.3);DIX(DEC、Intel、Xerox)又称V2以太网。DIX帧在源地址之后是两字节的Type,例如IP。IEEE以太网帧,在源地址后是帧长度指示,在随后的数据域中才是标准的LPDU封装,包括DSAP/SSAP/控制域/Data。在这个Data中会有协议ID、以太类型指示,例如以太类型806表示地址解析协议ARP。以太网卡通过跳针或软件可以设置需要的以太网版本,DIX通常都设的,因为大约90%的网络都用此版本。请注意网络所有要通信的站点应设成相同版本。

    介质访问层 
    

      介质访问控制是解决当局域网中共用信道的使用产生竞争时,如何分配信道的使用权问题。逻辑链路Logical Links是实际电路或逻辑电路上交换通信信息的两个端系统之间的一种协议驱动通信会话。协议栈定义了两个系统在某种介质上的通信。在协议栈低层定义可用的多种不同类型的通信协议,如局域网络(LAN)、城域网(MAN)和象X.25或帧中继这样的分组交换网络。逻辑链路在物理链路(可以是铜线、光纤或其他介质)上的两个通信系统之间形成。根据OSI协议模型,这些逻辑链路只在物理层以上存在。你可以认为逻辑链路是存在于网络两个末断系统间的线路。面向连接的服务 为了保证可靠的通信,需要建立逻辑线路,但在两个端系统间要维持会话。面向需要应答连接的服务 分组传输并有返回信号的逻辑线路。这种服务产生更大的开销,但更加可靠。无应答不连接服务 无需应答和预先的传送。在端系统间没有会话。

      OSI协议栈中的数据链路层可进一步细分为较低的介质访问控制(MAC)子层和较高的逻辑链路控制(LLC)子层。当它接收到一个分组后,它从MAC子层向上传送。如果有多个网络和设备相连,LLC层可能将分组送给另一个网络。例如,在一个NetWare服务器上,你可能既安装了以太网络适配器又安装了令牌网络适配器,NetWare自动地在连接到适配器的网络间桥接,这样原来在以太网上的分组就可以传送到令牌网上的目的地了,LLC层就象网络段间的交换或链路中继,它将以太网的帧重装成令牌环网的帧。

    2.4功能:
    数据链路层的最基本的功能是向该层用户提供透明的和可靠的数据传送基本服务。透明性是指该层上传输的数据的内容、格式及编码没有限制,也没有必要解释信息结构的意义;可靠的传输使用户免去对丢失信息、干扰信息及顺序不正确等的担心。在物理层中这些情况都可能发生,在数据链路层中必须用纠错码来检错与纠错。数据链路层是对物理层传输原始比特流的功能的加强,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一无差错的线路。如果您想用尽量少的词来记住数据链路层,那就是:“帧和介质访问控制”。

    帧同步 
    

      为了使传输中发生差错后只将有错的有限数据进行重发,数据链路层将比特流组合成以帧为单位传送。每个帧除了要传送的数据外,还包括校验码,以使接收方能发现传输中的差错。帧的组织结构必须设计成使接收方能够 明确地从物理层收到的比特流中对其进行识别,也即能从比特流中区分出帧的起始与终止,这就是帧同步要解决的问题。由于网络传输中很难保证计时的正确和一致,所以不可采用依靠时间间隔关系来确定一帧的起始与终止的方法。

      (1)字节计数法:这是一种以一个特殊字符表示一帧的起始并以一个专门字段来标明帧内字节数的帧同步方法。接收方可以通过对该特殊字符的识别从比特流中区分出帧的起始并从专门字段中获知该帧中随后跟随的数据字节数,从而可确定出帧的终止位置。面向字节计数的同步规程的典型代表是DEC公司的数字数据通信报文协议DDCMP(Digital Data Communications Message Protocol)。

      控制字符SOH标志数据帧的起始。实际传输中,SOH前还要以两个或更多个同步字符来确定一帧的起始,有时也允许本帧的头紧接着上帧的尾,此时两帧间就不必再加同步字符。 count字段共有14位,用以指示帧中数据段中数据的字节数,14位二进制数的最大值为2-1=16383,所以数据最大长度为8×16383=131064。DDCMP协议就是靠这个字节计数来确定帧的终止位置的。DDCMP帧格式中的ACK、SEG、ADDR及FLAG中的第2位,CRC1、CRC2分别对标题部分和数据部分进行双重校验,强调标题部分单独校验的原因是,一旦标题部分中的CONUT字段出错,即失却了帧边界划分的依据,将造成灾难性的后果。由于采用字符计数方法来确定帧的终止边界不会引起数据及其它信息的混淆,因而不必采用任何措施便可实现数据的透明性(即任何数据均可不受限制地传输)。

      (2)使用字符填充的首尾定界符法:该法用一些特定的字符来定界一帧的起始与终止,为了不使数据信息位中出现的与特定字符相同的字符被误判为帧的首尾定界符,可以在这种数据字符前填充一个转义控制字符(DLE)以示区别,从而达到数据的透明性。但这种方法使用起来比较麻烦,而且所用的特定字符过份依赖于所采用的字符编码集,兼容性比较差。

      (3)使用比特填充的首尾标志法:该法以一组特定的比特模式(如01111110)来标志一帧的起始与终止。本章稍后要详细介绍的HDLC规程即采用该法。为了不使信息位中出现的与特定比特模式相似的比特串被误判为帧的首尾标志,可以采用比特填充的方法。比如,采用特定模式01111110,则对信息位中的任何连续出现的五个“1”,发送方自动在其后插入一个“0”,而接收则做该过程的逆操作,即每接收到连续五个“1”,则自动删去其后所跟的“0”,以此恢复原始信息,实现数据传输的透明性。比特填充很容易由硬件来实现,性能优于字符填充方法。

      (4)违法编码法:该法在物理层采用特定的比特编码方法时采用。例如,一种被称作曼彻斯特编码的方法,是将数据比特“1”编码成“高-低”电平对,而将数据比特“0”编码成“低-高”电平对。而“高-高”电平对和“低-低”电平对在数据比特中是违法的。可以借用这些违法编码序列来定界帧的起始与终止。局域网IEEE 802标准中就采用了这种方法。违法编码法不需要任何填充技术,便能实现数据的透明性,但它只适用于采用冗余编码的特殊编码环境。由于字节计数法中COUNT字段的脆弱性以及字符填充法实现上的复杂性和不兼容性,目前较普遍使用的帧同步法是比特填充和违法编码法。

    差错控制 
    

      一个实用的通信系统必须具备发现(即检测)这种差错的能力,并采取某种措施纠正之,使差错被控制在所能允许的尽可能小的范围内,这就是差错控制过程,也是数据链路层的主要功能之一。对差错编码(如奇偶校验码,检查和或CRC)的检查,可以判定一帧在传输过程中是否发生了错误。一旦发现错误,一般可以采用反馈重发的方法来纠正。这就要求接收方收完一帧后,向发送方反馈一个接收是否正确的信息,使发送方所在此作出是不需要重新发送的决定,也即发送方仅当收到接收方已正确接收的反馈信号后才能认为该帧已经正确发送完毕,否则需要重新发送直至正确为止。物理信道的突发噪声可能完全“淹没”一帧,即使得整个数据帧或反馈信息帧丢失,这将导致发送方永远收不到接收方发来的反馈信息,从而使传输过程停滞.为了避免出现这种情况,通常引入计时器(Timer)来限定接收方发回反馈信息的时间间隔,当发送方发送一帧的同时也启动计时器,若在限定时间间隔内未能收到接收方的反馈信息,即计时器超时(Timeout),则可认为传的帧已出错或丢失,继而要重新发送。由于同一帧数据可能被重复发送多次,就可能引起接收方多次收到同一帧并将其递交给网络层的危险。为了防止发生这种危险,可以采用对发送的帧编号的方法,即赋予每帧一个序号,从而使接收方能从该序号来区分是新发送来的帧还是已经接收但又重新发送来的帧,以此来确定要不要将接收到的帧递交给网络层。数据链路层通过使用计数器和序号来保证每帧最终都被正确地递交给目标网络层一次。

    流量控制 
    

      流量控制并不是数据链路层所特有的功能,许多高层协议中也提供流时控功能,只不过流量控制的对象不同而已。比如,对于数据链路层来说,控制的是相邻两节点之间数据链路上的流量,而对于运输层来说,控制的则是从源到最终目的之间端的流量。由于收发双方各自使用的设备工作速率和缓冲存储的空间的差异,可能出现发送方发送能力大于接收方接收能力的现象,如若此时不对发送方的发送速率(也即链路上的信息流量)作适当的限制,前面来不及接收的帧将被后面不断发送来的帧“淹没”,从而造成帧的丢失而出错。由此可见,流量控制实际上是对发送方数据流量的控制,使其发送率不致超过接收方所能承受的能力。这个过程需要通过某种反馈机制使发送方知道接收方是否能跟上发送方,也即需要有一些规则使得发送方知道在什么情况下可以接着发送下一帧,而在什么情况下必须暂停发送,以等待收到某种反馈信息后继续发送。

    链路管理 
    

      链路管理功能主要用于面向连接的服务。当链路两端的节点要进行通信前,必须首先确认对方已处于就绪状态,并交换一些必要的信息以对帧序号初始化,然后才能建立连接,在传输过程中则要能维持该连接。如果出现差错,需要重新初始化,重新自动建立连接。传输完毕后则要释放连接。数据连路层连接的建立维持和释放就称作链路管理。在多个站点共享同一物理信道的情况下(例如在LAN中)如何在要求通信的站点间分配和管理信道也属于数据链路层管理的范畴。
      
    区分数据和控制信息

    由于数据和控制信息都是在同一信道中传送,而在许多情况下,数据和控制信息处于同一帧中。因此一定要有相应的措施使收方能够将它们区分开来。

    透明传输

    简单的说,透明传输就是发送方发送什么的数据,不管数据传输过程是如何实现的接收方将收到什么样的数据。更确切地说,所谓透明传输就是不管所传数据是什么样的比特组合,都应当能够在链路上传送。当所传数据中的比特组合恰巧出现了与某一个控制信息完全一样时,必须采取适当的措施,使收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输的透明的。

    寻址

    在多点连接的情况下,必须保证每一帧都能送到正确的目的站。收方也应当知道发方是哪一个站。

    数据链路层用到的设备:

    网桥(Bridge)也称为桥接器,是连接两个局域网的存储转发设备,用它可以使完全具有相同或相似体系结构网络系统的连接,这样不但能扩展网络的距离或范围,而且可提高网络的性能、可靠性和安全性。网桥工作在OSI参考模型的数据链路层(第二层),将两个LAN连起来,根据MAC地址来转发帧,可以看作一个“低层的路由器”(路由器工作在网络层,根据网络地址如IP地址进行转发)。

    交换机是主导网络系统的集线设备,大部分交换机是在OSI参考模型的数据链路层(第二层)操作。
    如果把集线器看成一条内置的以太网总线,交换机就可以看做由多条总线构成交换矩阵的互联系统。每一个交换机端口对应着一条高出一个数量级的背板带宽总线(Core Bus),背板总线与一个交换引擎(Switch Engining)相连接。不同端口间的数据包经背板总线进入交换引擎,通过存储转发、直通转发和准直通转发模式进行交换。

    值得注意的是,网桥与交换机的区别在与市场,而不在与技术。交换机对网络进行分段的方式与网桥相同,交换机就是一个多端口的网桥。确切地说,高端口密度的网桥就称为局域网交换机。
    交换机与网桥的真正区别主要在与现代的交换机与旧式网桥的区别上。

    交换机与网桥的区别:

    局域网交换机的基本功能与网桥一样,具有帧转发、帧过滤和生成树算法功能。但是,交换机与网桥相比还是存在以下不同:

    1、交换机工作时,实际上允许许多组端口间的通道同时工作。所以,交换机的功能体现出不仅仅是一个网桥的功能,而是多个网桥功能的集合。即网桥一般分有两个端口,而交换机具有高密度的端口。

    2、分段能力的区别

    由于交换机能够支持多个端口,因此可以把网络系统划分成为更多的物理网段,这样使得整个网络系统具有更高的带宽。而网桥仅仅支持两个端口,所以,网桥划分的物理网段是相当有限的。

    3、传输速率的区别

    交换机与网桥数据信息的传输速率相比,交换机要快于网桥。

    4、数据帧转发方式的区别

    网桥在发送数据帧前,通常要接收到完整的数据帧并执行帧检测序列FCS后,才开始转发该数据帧。交换机具有存储转发和直接转发两种帧转发方式。直接转发方式在发送数据以前,不需要在接收完整个数据帧和经过32bit循环冗余校验码CRC的计算检查后的等待时间。

    【转】OSI第二层数据链路层介绍1
    【转】OSI第二层数据链路层介绍2

    3.网络层

    网络层协议:

    网络层需要执行4个基本任务——用IP地址编址、封装、解封装、路由。其中前三项都很容易理解,路由是最复杂的部分,也是最有技术含量的部分。

    网络层: (典型设备:路由器,防火墙、多层交换机) 数据单元:数据包(Packet )

    IP (IPv4 · IPv6) (Internet Protocol) 网络之间互连的协议

    ARP (Address Resolution Protocol) 即地址解析协议,实现通过IP 地址得 知其物理地址。

    RARP (Reverse Address Resolution Protocol)反向地址转换协议允许局域 网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP地址。

    ICMP (Internet Control Message Protocol )Internet 控制报文协议。它是TCP/IP 协议族的一个子协议,用于在IP 主机、路由器之间传递控制消息。

    ICMPv6 :

    IGMP (Internet Group Management Protocol) Internet 组管理协议,是因特 网协议家族中的一个组播协议,用于 IP 主机向任一个直接相邻的路由器报 告他们的组成员情况。

    RIP (Router information protocol) 路由信息协议是一种在网关与主机之间交换路由选择信息的标准。

    OSPF (Open Shortest Path Firs)开放式最短路径优先,分布式链路状态协议。

    BGP(Border Gateway Protocol )边界网关协议,用来连接Internet 上独立系统的路由选择协议.采用路径向量路由选择协议。

    IS-IS (Intermediate System to Intermediate System Routing Protocol )中间系统到中间系统的路由选择协议.

    IPsec (IP Secure) “Internet 协议安全性”是一种开放标准的框架结构,通过使用加密的安全服务以确保在 Internet 协议 (IP) 网络上进行保密而安全的通讯。

    【转】OSI第三层网络层介绍1
    【转】OSI第三层网络层介绍-ip介绍
    【转】OSI第三层网络层介绍-路由协议

    4、传输层

    传输层协议:

    传输层: (典型设备: 进程和端口) 数据单元:数据段 (Segment)

    TCP (Transmission Control Protocol )传输控制协议提供可靠的面向连接的服务,传输数据前须先建立连接,结束后释放。可靠的全双工信道。可靠、有序、无丢失、不重复。

    UDP (User Datagram Protocol )用户数据报协议发送数据前无需建立连接,不使用拥塞控制,不保证可靠交付,最大努力交付。

    DCCP (Datagram Congestion Control Protocol )数据报拥塞控制协议

    SCTP (STREAM CONTROL TRANSMISSION PROTOCOL )流控制传 输协议

    RTP(Real-time Transport Protocol )实时传送协议

    RSVP (Resource ReSer Vation Protocol )资源预留协议

    PPTP ( Point to Point Tunneling Protocol )点对点隧道协议

    4.1介绍:

    传输层的作用是什么?传输层实现端到端的连接,端到端是什么概念呢?打个比方说,一个人用QQ与朋友聊天,网络层识别IP地址,能够将信息送到正确的主机,而主机应该使用什么应用协议接收这个信息呢? 这个功能就需要传输层来完成,传输层实现进程到进程的连接。

    TCP报文:

    TCP报文

    这里写图片描述

    这里写图片描述

    TCP/UDP传输过程1
    TCP/UDP传输过程2

    5、应用层

    应用层协议:

    应用层: (典型设备:应用程序,如FTP,SMTP ,HTTP)

    DHCP(Dynamic Host Configuration Protocol)动态主机分配协议,使用 UDP 协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配 IP 地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。实 现即插即用连网。

    BOOTP (BOOTstrapProtocol) 引导程序协议/ 自举协议,使用UDP 来使 一个无盘工作站自动获取配置信息。静态的配置协议 DNS (Domain Name System )域名解析<端口号53>

    FTP (File Transfer Protocol )文件传输协议<端口号21>减少或消除不同操作系统下处理文件的不兼容性。

    Gopher (The Internet Gopher Protocol )网际Gopher 协议

    HTTP (Hypertext Transfer Protocol )超文本传输协议 <端口号 80>, 面向事务的应用层协议。

    IMAP4 (Internet Message Access Protocol 4) Internet 信息访问协议的第 4 版本

    IRC (Internet Relay Chat )网络聊天协议

    NNTP (Network News Transport Protocol )网络新闻传输协议

    XMPP 可扩展消息处理现场协议

    POP3 (Post Office Protocol 3) 即邮局协议的第3 个版本,用于接受邮件。

    SIP()信令控制协议

    SMTP (Simple Mail Transfer Protocol )简单邮件传输协议 <端口号25> 用于发送邮件。

    SNMP (Simple Network Management Protocol),简单网络管理协议

    SSH (Secure Shell )安全外壳协议

    TELNET 远程登录协议 <端口号23>

    RPC (Remote Procedure Call Protocol )(RFC- 1831)远程过程调用协 议

    RTCP (RTP Control Protocol )RTP 控制协议

    RTSP (Real Time Streaming Protocol )实时流传输协议

    TLS (Transport Layer Security Protocol )安全传输层协议

    SDP( Session Description Protocol )会话描述协议

    SOAP (Simple Object Access Protocol )简单对象访问协议

    GTP 通用数据传输平台

    STUN (Simple Traversal of UDP over NATs ,NAT 的UDP 简单穿越) 是一种网络协议

    NTP (Network Time Protocol )网络校时协议。



    OSI各层对应的设备—–集线器、交换机、路由器、中继器及网关、网桥之间的区别 :

    一、集线器

    集线器也称HUB,工作在OSI七层结构的第一层物理层,属于共享型设备,接收数据广播发出,在局域网内一般都是星型连接拓扑结构,每台工作站都连接到集线器上。由于集线器的带宽共享特性导致网络利用效率极低,一般在大中型的网络中不会使用到集线器。现在的集线器基本都是全双工模式,市面上常见的集线器传输速率普遍都为100Mbps。

    二、交换机

    交换机顾名思义以交换为主要功能,工作在OSI第二层(数据链路层),根据MAC地址进行数据转发。交换机的每一个端口都属于一个冲突域,而集线器所有端口属于一个冲突域。交换机通过分析Ethernet包的包头信息(其中包含了源MAC地址、目标MAC地址、信息长度等),取得目标MAC地址后,查找交换机中存储的地址对照表(MAC地址对应的端口),确认具有此MAC地址的网卡连接在哪个端口上,然后将信包送到对应端口,有效的抑制IP广播风暴。并且信息包处于并行状态,效率较高。

    交换机的转发延迟非常小,主要的得益于其硬件设计机理非常高效,为了支持各端口的最大数据传输速率,交换机内部转发信包的背板带宽都必须远大于端口带宽,具有强大的整体吞吐率,才能为每台工作站提供更高的带宽和更高的网络利用率,可以满足大型网络环境大量数据并行处理 的要求。

    三、路由器

    路由器跟集线器和交换机不同,是工作在OSI的第三层(网络层),根据IP进行寻址转发数据包。路由器是一种可以连接多个网络或网段的网络设备,能将不同网络或网段之间(比如局域网——大网)的数据信息进行转换,并为信包传输分配最合适的路径,使它们之间能够进行数据传输,从而构成一个更大的网络。

    路由器具有最主要的两个功能,即数据通道功能和控制功能。数据通道功能包括转发决定、背板转发以及输出链路调度等,一般由特定的硬件来完成;控制功能一般用软件来实现,包括与相邻路由器之间的信息交换、系统配置、系统管理等。

    四、中继器

    中继器(Repeater)工作于OSI的第一层(物理层),中继器是最简单的网络互联设备,连接同一个网络的两个或多个网段,主要完成物理层的功能,负责在两个网络节点的物理层上按位传递信息,完成信号的复制、调整和放大功能,以此从而增加信号传输的距离,延长网络的长度和覆盖区域,支持远距离的通信。

    一般来说,中继器两端的网络部分是网段,而不是子网。中继器只将任何电缆段上的数据发送到另一段电缆上,并不管数据中是否有错误数据或不适于网段的数据。大家最常接触的是网络中继器,在通讯上还有微波中继器、激光中继器、红外中继器等等,机理类似,触类旁通。

    五、网关

    网关(Gateway)又叫协议转换器,网关的概念实际上跟上面的设备型不是一类问题,但是为了方便参考还是放到这里一并介绍。

    网关是一种复杂的网络连接设备,可以支持不同协议之间的转换,实现不同协议网络之间的互连。网关具有对不兼容的高层协议进行转换的能力,为了实现异构设备之间的通信,网关需要对不同的链路层、专用会话层、表示层和应用层协议进行翻译和转换。所以网关兼有路由器、网桥、中继器的特性。

    若要使两个完全不同的网络(异构网)连接在一起,一般使用网关,在Internet中两个网络也要通过一台称为网关的计算机实现互联。这台计算机能根据用户通信目标计算机的IP地址,决定是否将用户发出的信息送出本地网络,同时,它还将外界发送给属于本地网络计算机的信息接收过来,它是一个网络与另一个网络相联的通道。为了使TCP/IP协议能够寻址,该通道被赋予一个IP地址,这个IP地址称为网关地址。

    所以,网关的作用就是将两个使用不同协议的网络段连接在一起的设备,对两 个网络段中的使用不同传输协议的数据进行互相的翻译转换。在互连设备中,由于协议转换的复杂性,一般只能进行一对一的转换,或是少数几种特定应用协议的转换。

    六、网桥

    网桥和交换机一样都是工作在OSI模型的第二层(数据链路层),可以看成是一个二层路由器(真正的路由器是工作在网络层,根据IP地址进行信包转发)。网桥可有效的将两个局域网(LAN)连起来,根据MAC地址(物理地址)来转发帧,使本地通信限制在本网段内,并转发相应的信号至另一网段,网桥通常用于联接数量不多的、同一类型的网段。

    展开全文
  • Java 网络编程

    万次阅读 多人点赞 2019-05-30 23:07:18
    网络编程 一、网络编程基础概念 首先理清一个概念:网络编程不等于网站编程,网络编程即使用套接字来达到进程间通信,现在一般称为TCP/IP编程。 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信...

    首先理清一个概念:网络编程不等于网站编程,网络编程即使用套接字来达到进程间通信,现在一般称为TCP/IP编程。

    一、计算机网络

    (一)概念

    计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

    (二)计算机网络的主要功能

    1. 资源共享
      资源共享包括计算机硬件资源、软件资源和数据资源的共享。硬件资源的共享提高了计算机硬件资源的利用率,由于受经济和其他因素的制约,这些硬件资派不可能所有用户都有,所以使用计算机网络不仅可以使用自身的硬件资源,也可共享网络上的资源。软件资源和数据资源的共享可以充分利用已有的信息资派.减少软件开发过程中的劳动,避免大型数据库的重复建设。
    2. 信息交换
      这是计算机网络最基本的功能.计算机网络中的计算机之间或计算机与终端之间,可以快速可靠地相互传递数据、程序或文件。例如,用户可以在网上传送电子邮件、交换数据,可以实现在商业部门或公司之间进行订单、发票等商业文件安全准确地交换。
    3. 均衡负荷与分布处理
      对于大型的任务或课题.如果都集中在一台计算机上.负荷太重,这时可以将任务分散到不同的计算机分别完成,或由网络中比较空闲的计算机分担负荷,各个计算机连成网络有利于共同协作进行重大科研课题的开发和研究。利用网络技术还可以将许多小型机或傲型机连成具有高性能的分布式计算机系统,使它具有解决复杂问题的能力,从而大大降低费用。
    4. 综合信息服务
      计算机网络可以向全社会提供各处经济信息、科研情报、商业信息和咨询服务,如Internet中的www就是如此。

    (三)计算机网络分类

    计算机网络按其覆盖的地理范围可分为如下3类:

    • 局域网(LAN)。局域网是一种在小区域内使用的,由多台计算机组成的网络,覆盖范围通常局限在10 千米范围之内,属于一个单位或部门组建的小范围网。
    • 城域网(MAN)。城域网是作用范围在广域网与局域网之间的网络,其网络覆盖范围通常可以延伸到整个城市,借助通信光纤将多个局域网联通公用城市网络形成大型网络,使得不仅局域网内的资源可以共享,局域网之间的资源也可以共享。
    • 广域网(WAN) 广城网是一种远程网,涉及长距离的通信,覆盖范围可以是个国家或多个国家,甚至整个世界。由于广域网地理上的距离可以超过几千千米,所以信息衰减非常严重,这种网络一般要租用专线,通过接口信息处理协议和线路连接起来,构成网状结构,解决寻径问题。

    二、网络通信协议及接口

    (一)网络通信协议

    计算机网络中实现通信必须有一些约定,即通信协议;包括对速率,传输代码,代码结构,传输控制步骤,出错控制等制定的标准。常见的网络通信协议有:TCP/IP协议、IPX/SPX协议、NetBEUI协议等。

    TCP/IP协议:传输控制协议/因特网互联协议(Transmission Control Protocol/Internet Protocal),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

    (二)网络通信接口

    为了使两个节点之间能进行对话,必须在他们之间建立通信工具(即接口),使彼此之间,能进行信息交换。接口包括两部分:

    • 硬件装置:实现结点之间的信息传送
    • 软件装置:规定双方进行通信的约定协议

    (三)通信协议分层思想

    1.为什么要分层

    由于结点之间联系很复杂,在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式就是层次方式,及同层间可以通信,上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。

    2.通信协议的分层规定

    把用户应用程序作为最高层,把物理通信线路作为最底层,将其间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准。

    3.参考模型

    在这里插入图片描述
    上图中,TCP/IP协议中的四层分别是应用层、传输层、网络层和链路层,每层分别负责不同的通信功能。

    • 应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。
    • 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
    • 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
    • 数据链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。

    我们编写的程序位于应用层,因此我们的程序是和TCP/UDP打交道的。

    (四)协议分类

    通信的协议还是比较复杂的,java.net包中包含的类和接口,它们提供低层次的通信细节,我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。

    java.net包中提供了两种常见的网络协议的支持:TCP和UDP

    • TCP是可靠的连接,TCP就像打电话,需要先打通对方电话,等待对方有回应后才会跟对方继续说话,也就是一定要确认可以发信息以后才会把信息发出去。TCP上传任何东西都是可靠的,只要两台机器上建立起了连接,在本机上发送的数据就一定能传到对方的机器上。
    • UDP就好比发电报,发出去就完事了,对方有没有接收到它都不管,所以UDP是不可靠的。
    • TCP传送数据虽然可靠,但传送得比较慢;UDP传送数据不可靠,但是传送得快。

    1.UDP

    • 用户数据报协议(User Datagram Protocol)。
    • 数据报(Datagram):网络传输的基本单位
    • UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
    • 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
    • 但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时,不建议使用UDP协议。
    • 特点:数据被限制在64kb以内,超出这个范围就不能发送了。

    2.TCP

    • 传输控制协议(Transmission Control Protocol)。
    • TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
    • 在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。

    (1)三次握手

    TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

    在这里插入图片描述

    • 第一次握手,客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
      (客户端向服务器端发出连接请求,等待服务器确认。)
    • 第二次握手,服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。(服务器端向客户端回送一个响应,通知客户端收到了连接请求。)
    • 第三次握手,客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。(客户端再次向服务器端发送确认信息,确认连接。)

    三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

    (2)四次挥手

    其次,TCP的客户端和服务端断开连接,需要四次挥手
    在这里插入图片描述

    • 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。
    • 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。
    • 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
    • 等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
    • 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
    • 服务器收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭。
    • 客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭。

    你可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手。这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。

    为什么挥手需要四次?
    关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次。参考

    通俗理解:

    • 三次握手
      A:我要过来了!B:我知道你要过来了!A:我现在过来!
    • 四次挥手
      A:我们分手吧!B:真的分手吗?B:真的真的要分手吗?A:是的!

    由此,可以可靠地进行连接和断开。

    三、IP协议

    (一)概念

    IP协议:网络互连协议

    在这里插入图片描述
    每个人的电脑都有一个独一无二的IP地址,这样互相通信时就不会传错信息了。

    (二)分类

    IP地址根据版本可以分类为:IPv4和IPv6

    IPv4IPv6
    地址长度IPv4协议具有32位(4字节)地址长度IPv6协议具有128位(16字节)地址长度
    格式IPv4 地址的文本格式为 nnn.nnn.nnn.nnn,其中 0<=nnn<=255,而每个 n 都是十进制数。可省略前导零。IPv6 地址的文本格式为 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx,其中每个 x 都是十六进制数可省略前导零。
    数量共有43亿,30亿在北美,4亿在亚洲,2011年就已经用尽多到每一粒沙子都可以分配一个IPv6地址

    在这里插入图片描述
    IPv4又可以分为五类:

    • A类:在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码;A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,有126个网络,每个网络可以容纳主机数达1600多万(256的三次方-2)台。

    • B类:在IP地址的四段号码中,前两段号码为网络号码。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,有16384个网络,每个网络所能容纳的计算机数为6万多(256的二次方-2)台

    • C类:在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码;此类地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,有209万余个网络。适用于小规模的局域网络,每个网络最多只能包含254(256-2)台计算机

    • D类:此类IP地址在历史上被叫做多播地址(multicast address),即组播地址;在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点;多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255

    • E类: 此类地址也不分网络地址和主机地址,它的第1个字节的前五位固定为“11110”,为将来使用保留,地址范围从240.0.0.1到255.255.255.254

    (三)InetAddress类

    说到IP地址,就要引入一个类:InetAddress
    此类表示互联网协议 (IP) 地址
    在这里插入图片描述

    InetAddress类无构造方法

    1.常用方法摘要

    byte[] getAddress()
    返回此 InetAddress 对象的原始 IP 地址。
    static InetAddress getByName(String host)
    在给定主机名的情况下确定主机的 IP 地址。
    String getHostAddress()
    返回 IP 地址字符串(以文本表现形式)。
    String getHostName()
    获取此 IP 地址的主机名。
    static InetAddress getLocalHost()
    返回本地主机。
    127.0.0.1:本机地址,主要用于测试。别名:Localhost

    案例演示1

    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class TestIP {
        public static void main(String[] args) throws UnknownHostException {
            //InetAdress类表示IP地址
    
            //获取本机IP
            InetAddress ip = InetAddress.getLocalHost();// ADMINISTRATOR/192.xxx.xxx.xxx
            System.out.println(ip);
            //获得主机名
            System.out.println(ip.getHostName());// ADMINISTRATOR
            //获得IP地址
            System.out.println(ip.getHostAddress());// 192.xxx.xxx.xxx
            //getLocalHost=getHostName+getHostAddress
            System.out.println(InetAddress.getByName("localhost"));
        }
    }
    

    案例演示2

    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class TestIP2 {
        public static void main(String[] args) throws UnknownHostException {
            InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
            // 获取此 IP 地址的主机名。
            System.out.println(inetAddress.getHostName());
            //返回 IP 地址字符串(以文本表现形式)。
            System.out.println(inetAddress.getHostAddress());
        }
    }
    

    在这里插入图片描述

    四、端口

    • IP地址用来标识一台计算机,但是一台计算机上可能提供多种网络应用程序,如何来区分这些不同的程序呢?这就要用到端口。端口号是用来区分一台机器上不同的应用程序的。
    • 我们使用IP地址加端口号,就可以保证数据准确无误地发送到对方计算机的指定软件上了。
    • 端口是虚拟的概念,是一个逻辑端口。
    • 当我们使用网络软件一打开,那么操作系统就会为网络软件分配一个随机的端口号,或者打开的时候向系统要指定的端口号。
    • 通过端口,可以在一个主机上运行多个网络应用程序。端口的表示是一个16位的二进制整数,2个字节,对应十进制的0~65535
    • 端口号在计算机内部是占2个字节。一台机器上最多有65536个端口号。一个应用程序可以占用多个端口号。端口号如果被一个应用程序占用了,那么其他的应用程序就无法再使用这个端口号了。
    • 记住一点,我们编写的程序要占用端口号的话占用1024以上的端口号,1024以下的端口号不要去占用,因为系统有可能会随时征用。端口号本身又分为TCP端口和UDP端口,TCP的8888端口和UDP的8888端口是完全不同的两个端口。TCP端口和UDP端口都有65536个

    (一)分类

    1. 公有端口:0~1023
      • HTTP:80
      • HTTPS:443
      • FTP:21
      • Telnet:23
    2. 程序注册端口(分配给用户或者程序):1024~49151
      • Tomcat:8080
      • MySQL:3306
      • Oracle:1521
    3. 动态、私有端口:49152~65535

    (二)DOS命令查看端口

    • 查看所有端口:netstat -ano
    • 查看指定端口:netstat -ano|findstr "端口号"
    • 查看指定端口的进程:tasklist|findstr "端口号"

    (三)InetSocketAddress类

    说到端口,则要引入一个类:InetSocketAddress

    此类实现 IP 套接字地址(IP 地址 + 端口号)。

    1.构造方法摘要

    InetSocketAddress(InetAddress addr, int port)
    根据 IP 地址和端口号创建套接字地址。
    InetSocketAddress(int port)
    创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值。
    InetSocketAddress(String hostname, int port)
    根据主机名和端口号创建套接字地址。

    2.常用方法摘要

    InetAddress getAddress()
    获取 InetAddress。
    String getHostName()
    获取 hostname。
    int getPort()
    获取端口号。

    案例演示

    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    
    public class TestPort {
        public static void main(String[] args) {
            InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8082);
            System.out.println(inetSocketAddress);
            //返回主机名
            System.out.println(inetSocketAddress.getHostName());
            //获得InetSocketAddress的端口
            System.out.println(inetSocketAddress.getPort());
            //返回一个InetAddress对象(IP对象)
            InetAddress address = inetSocketAddress.getAddress();
            System.out.println(address);
        }
    }
    

    在这里插入图片描述

    五、TCP网络编程和UDP网络编程

    网络编程也叫做Socket编程,即套接字编程。套接字指的是两台设备之间通讯的端点。

    在这里插入图片描述

    (一)TCP网络编程

    1.概述

    TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。

    (1)两端通信时步骤:

    1. 服务端程序,需要事先启动,等待客户端的连接。
    2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。

    (2)在Java中,提供了两个类用于实现TCP通信程序:

    1. 客户端:java.net.Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
    2. 服务端:java.net.ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

    2.Socket类

    Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。

    (1)构造方法摘要

    • public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址
      回送地址(127.x.x.x) 是本机回送地址(Loopback Address),主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输。

    案例演示

    Socket client = new Socket("127.0.0.1", 6666);
    

    (2)常用方法摘要

    • public InputStream getInputStream() : 返回此套接字的输入流。

      • 如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。
      • 关闭生成的InputStream也将关闭相关的Socket。
    • public OutputStream getOutputStream() : 返回此套接字的输出流。

      • 如果此Socket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。
      • 关闭生成的OutputStream也将关闭相关的Socket。
    • public void close() :关闭此套接字。

      • 一旦一个socket被关闭,它不可再使用。
      • 关闭此socket也将关闭相关的InputStream和OutputStream 。
    • public void shutdownOutput() : 禁用此套接字的输出流。

      • 任何先前写出的数据将被发送,随后终止输出流。

    3.ServerSocket类

    ServerSocket类:这个类实现了服务器套接字,该对象等待通过网络的请求。

    (1)构造方法摘要

    • public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。

    案例演示

    ServerSocket server = new ServerSocket(6666);
    

    (2)常用方法摘要

    • public Socket accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。

    4.代码实现

    案例演示1

    客户端:

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class TCPClient {
        public static void main(String[] args){
            Socket socket = null;
            OutputStream os = null;
            try {
                //1、创建Socket对象,它的第一个参数需要的是服务端的IP,第二个参数是服务端的端口
                InetAddress inet = InetAddress.getByName("127.0.0.1");
                socket = new Socket(inet,8090);
                //2、获取一个输出流,用于写出要发送的数据
                os = socket.getOutputStream();
                //3、写出数据
                os.write("你好,我是客户端!".getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {//4、释放资源
                if(socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(os!=null){
                    try {
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    服务端:

    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPServer {
        public static void main(String[] args) {
            ServerSocket serverSocket = null;
            Socket socket = null;
            InputStream is = null;
            ByteArrayOutputStream baos = null;
            try {
                //1、创建服务端的ServerSocket,指明自己的端口号
                serverSocket = new ServerSocket(8090);
                //2、调用accept接收到来自于客户端的socket
                socket = serverSocket.accept();//阻塞式监听,会一直等待客户端的接入
                //3、获取socket的输入流
                is = socket.getInputStream();
    
    //        不建议这样写:因为如果我们发送的数据有汉字,用String的方式输出可能会截取汉字,产生乱码
    //        int len=0;
    //        byte[] buffer = new byte[1024];
    //        while ((len=is.read(buffer))!=-1){
    //            String str = new String(buffer, 0, len);
    //            System.out.println(str);
    //        }
                
                //4、读取输入流中的数据
                //ByteArrayOutputStream的好处是它可以根据数据的大小自动扩充
                baos = new ByteArrayOutputStream();
                int len=0;
                byte[] buffer = new byte[1024];
                while ((len=is.read(buffer))!=-1){
                    baos.write(buffer,0,len);
                }
                System.out.println("收到了来自于客户端"+socket.getInetAddress().getHostName()
                        +"的消息:"+baos.toString());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {//5、关闭资源
                if(serverSocket!=null){
                    try {
                        serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(is!=null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(baos!=null){
                    try {
                        baos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    

    在这里插入图片描述
    服务器是没有IO流的,服务器可以获取到请求的客户端对象socket
    使用每个客户端socket中提供的IO流和客户端进行交互
    服务器使用客户端的字节输入流读取客户端发送的数据
    服务器使用客户端的字节输出流给客户端回写数据

    案例演示2
    服务端向客户端回写数据

    客户端:

    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class TCPClient {
        public static void main(String[] args){
            Socket socket = null;
            OutputStream os = null;
            ByteArrayOutputStream baos=null;
            InputStream is=null;
            try {
                //1、创建Socket对象,它的第一个参数需要的是服务端的IP,第二个参数是服务端的端口
                InetAddress inet = InetAddress.getByName("127.0.0.1");
                socket = new Socket(inet,8888);
                //2、获取一个输出流,用于写出要发送的数据
                os = socket.getOutputStream();
                //3、写出数据
                os.write("你好,我是客户端!".getBytes());
                //==========================解析回复==================================
                //4、首先必须通知服务器,我已经输出完毕了,不然服务端不知道什么时候输出完毕
                //服务端的while循环会一直执行,会阻塞
                socket.shutdownOutput();
                ///5、获取输入流,用于读取服务端回复的数据
                is = socket.getInputStream();
                baos = new ByteArrayOutputStream();
                int len=0;
                byte[] buffer = new byte[1024];
                while ((len=is.read(buffer))!=-1){
                    baos.write(buffer,0,len);
                }
                System.out.println("收到了来自服务端的消息:"+baos.toString());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {//6、释放资源
                if(socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(os!=null){
                    try {
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(is!=null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (baos!=null){
                    try {
                        baos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    服务端:

    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPServer {
        public static void main(String[] args) {
            ServerSocket serverSocket = null;
            Socket socket = null;
            InputStream is = null;
            ByteArrayOutputStream baos = null;
            OutputStream os=null;
            try {
                //1、创建服务端的ServerSocket,指明自己的端口号
                serverSocket = new ServerSocket(8888);
                //2、调用accept接收到来自于客户端的socket
                socket = serverSocket.accept();//阻塞式监听,会一直等待客户端接入
                //3、获取socket的输入流
                is = socket.getInputStream();
    
    //        不建议这样写:因为如果我们发送的数据有汉字,用String的方式输出可能会截取汉字,产生乱码
    //        int len=0;
    //        byte[] buffer = new byte[1024];
    //        while ((len=is.read(buffer))!=-1){
    //            String str = new String(buffer, 0, len);
    //            System.out.println(str);
    //        }
    
                //4、读取输入流中的数据
                //ByteArrayOutputStream的好处是它可以根据数据的大小自动扩充
                baos = new ByteArrayOutputStream();
                int len=0;
                byte[] buffer = new byte[1024];
                while ((len=is.read(buffer))!=-1){
                    baos.write(buffer,0,len);
                }
                System.out.println("收到了来自于客户端"+socket.getInetAddress().getHostName()
                        +"的消息:"+baos.toString());
                //===========================回复==========================================
                //5、获取一个输出流,写出回复给客户端
                os = socket.getOutputStream();
                //6、写出数据
                os.write("你好,我是服务端".getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {//7、关闭资源
                if(serverSocket!=null){
                    try {
                        serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(is!=null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(baos!=null){
                    try {
                        baos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(os!=null){
                    try {
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    在这里插入图片描述
    在这里插入图片描述
    案例演示3
    上传文件:客户端发送文件给服务端,服务端将文件保存在本地
    在这里插入图片描述

    客户端:

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class TCPClient {
        public static void main(String[] args) {
            Socket socket = null;
            FileInputStream fis = null;
            OutputStream os = null;
            try {
                //1、创建Socket对象,它的第一个参数需要的是服务端的IP,第二个参数是服务端的端口
                InetAddress inet = InetAddress.getByName("127.0.0.1");
                socket = new Socket(inet, 8888);
                //2、创建一个文件输入流,读取要上传的文件
                fis = new FileInputStream("D:/test/touxiang.jpg");
                //3、获取一个输出流,用于写出要发送的数据
                os = socket.getOutputStream();
                byte[] buffer = new byte[1024];
                int len=0;
                while((len=fis.read(buffer))!=-1){
                    //4、写出数据
                    os.write(buffer,0,len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {//5、释放资源
                if(socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(fis!=null){
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(os!=null){
                    try {
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    服务端:

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPServer {
        public static void main(String[] args) {
            ServerSocket serverSocket = null;
            Socket socket = null;
            FileOutputStream fos = null;
            InputStream is = null;
            try {
                //1、创建服务端的ServerSocket,指明自己的端口号
                serverSocket = new ServerSocket(8888);
                //2、调用accept接收到来自于客户端的socket
                socket = serverSocket.accept();//阻塞式监听,会一直等待客户端的接入
                //3、创建一个文件输出流,用于将读取到的客户端上传的文件输出
                fos = new FileOutputStream("touxiang.jpg");
                //4、获取socket的输入流
                is = socket.getInputStream();
                byte[] buffer = new byte[1024];
                int len=0;
                while((len=is.read(buffer))!=-1){
                    fos.write(buffer,0,len);//5、写出文件
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {//6、释放资源
                if(serverSocket!=null){
                    try {
                        serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(fos!=null){
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(is!=null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    假设大海里有许多岛屿,客户端和服务端相当于其中的两座岛屿,“客户端”岛屿生产了一种农作物要运到“服务端”岛屿,所以“客户端”要知道“服务端”确切的地址(IP),不然就运错地方了,socket就相当于运输的船只,port就相当于“服务端”岛屿的某个港口。

    (二)UDP网络编程

    从技术意义上来讲,只有TCP才会分Server和Client。对于UDP来说,严格意义上,并没有所谓的Server和Client。
    java.net包给我们提供了两个类DatagramSocket(此类表示用于发送和接收数据报的套接字)和DatagramPacket(该类表示数据报的数据包。 )

    1.DatagramSocket

    (1)构造方法摘要

    protected DatagramSocket()构造数据报套接字并将其绑定到本地主机上的任何可用端口。
    protected DatagramSocket(int port)构造数据报套接字并将其绑定到本地主机上的指定端口。
    protected DatagramSocket(int port, InetAddress laddr)创建一个数据报套接字,绑定到指定的本地地址。

    2.DatagramPacket

    (1)构造方法摘要

    DatagramPacket(byte[] buf, int offset, int length)构造一个 DatagramPacket用于接收指定长度的数据报包到缓冲区中。
    DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)构造用于发送指定长度的数据报包到指定主机的指定端口号上。

    (2)常用方法摘要

    byte[] getData() 返回数据报包中的数据。
    InetAddress getAddress() 返回该数据报发送或接收数据报的计算机的IP地址。
    int getLength() 返回要发送的数据的长度或接收到的数据的长度。

    3.代码实现

    案例演示1
    发送方:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class UDPSender {
        public static void main(String[] args) throws IOException {
            //1、创建一个socket
            DatagramSocket socket = new DatagramSocket();
            InetAddress inet = InetAddress.getLocalHost();
            String msg="你好,很高兴认识你!";
            byte[] buffer = msg.getBytes();
            //2、创建一个包(要发送给谁)
            DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length,inet,9090);
            //3、发送包
            socket.send(packet);
            //4、释放资源
            socket.close();
        }
    }
    

    接收方:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UDPReceiver {
        public static void main(String[] args) throws IOException {
            //1、创建一个socket,开放端口
            DatagramSocket socket = new DatagramSocket(9090);
            byte[] buffer = new byte[1024];
            //2、创建一个包接收数据
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
            //3、接收数据
            socket.receive(packet);//阻塞式接收
            //将数据包转换为字符串输出
            String msg = new String(packet.getData(), 0, packet.getLength());
            System.out.println(msg);
            //4、释放资源
            socket.close();
        }
    }
    

    在这里插入图片描述
    注意
    如果是TCP中先启动客户端会报错:
    在这里插入图片描述
    而如果是UDP中先启动发送方不会报错,但会正常退出。

    案例演示2
    完成在线咨询功能,学生和老师在线一对一交流(多线程

    发送方:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    
    public class UDPSender implements Runnable{
        //创建一个socket
        DatagramSocket socket=null;
        //创建一个流 用于录入键盘的数据
        BufferedReader bfr=null;
        //发送数据目的地的IP
        private String toIP;
        //发送数据目的地的端口
        private int toPort;
    
        public UDPSender(String toIP, int toPort) {
            this.toIP = toIP;
            this.toPort = toPort;
            try {
                socket=new DatagramSocket();//创建一个socket
            } catch (SocketException e) {
                e.printStackTrace();
            }
            bfr=new BufferedReader(new InputStreamReader(System.in));//从键盘录入数据到流中
        }
    
        @Override
        public void run() {
            while (true){//循环发送数据
                try {
                    String msg = bfr.readLine();//从流中读取数据
                    byte[] buffer = msg.getBytes();
                    InetAddress inet = InetAddress.getByName(toIP);
                    DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length, inet, toPort);
                    socket.send(packet);
                    //如果发送了拜拜,则退出发送
                    if(msg.equals("拜拜")){
                        break;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //释放资源
            if(socket!=null){
                socket.close();
            }
            if (bfr!=null){
                try {
                    bfr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    接收方:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    public class UDPReceiver implements Runnable{
        //创建一个socket
        DatagramSocket socket=null;
        //接收方自己所在的端口
        private int fromPort;
        //数据发送者的姓名
        private String msgFrom;
    
        public UDPReceiver(int fromPort,String msgFrom) {
            this.fromPort = fromPort;
            this.msgFrom=msgFrom;
            try {
                socket=new DatagramSocket(fromPort);//创建一个socket
            } catch (SocketException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void run() {
            while(true){//循环接收
                try {
                    byte[] buffer = new byte[1024 * 8];
                    DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
                    socket.receive(packet);
                    String msg = new String(packet.getData(), 0, packet.getLength());
                    System.out.println(msgFrom+":"+msg);
                    if (msg.equals("拜拜")){//如果接收到的数据为拜拜,则退出接收
                        break;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //释放资源
            socket.close();
        }
    }
    

    学生线程:

    public class Student {
        public static void main(String[] args) {
            new Thread(new UDPSender("127.0.0.1",8888)).start();
            new Thread(new UDPReceiver(7777,"老师")).start();
        }
    }
    

    老师线程:

    public class Teacher {
        public static void main(String[] args) {
            new Thread(new UDPSender("127.0.0.1",7777)).start();
            new Thread(new UDPReceiver(8888,"学生")).start();
        }
    }
    

    学生的窗口:
    在这里插入图片描述
    老师的窗口:
    在这里插入图片描述

    六、URL

    (一)概念

    URL(Uniform Resource Locator)统一资源定位符,它表示Internet上某一资源的地址。
    通过URL我们可以访问Internet上的各种网络资源,比如最常见的www,ftp站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。

    URI=URL+URN

    • URI:Uniform Resource Identifier ,统一资源标志符。
    • URL:Uniform Resource Locator,统一资源定位符。
    • URN:Uniform Resource Name,统一资源命名。

    网络三大基石:HTML,HTTP,URL

    (二)格式

    URL的基本结构由5部分组成:
    <传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表

    • 片段名:即锚点,例如看小说,直接定位到章节
    • 参数列表格式:参数名=参数值&参数名=参数值......

    例如:
    http://localhost:8080/index.jsp#a?username=Tom&password=123456

    (三)URL类

    java.net包下

    1.构造方法摘要

    URL(String spec)根据 String 表示形式创建 URL 对象。
    URL(String protocol, String host, int port, String file) 根据指定协议名、主机名、端口号和文件名创建 URL 对象。
    URL(String protocol, String host, String file) 根据指定的协议名、主机名和文件名创建 URL。

    2.常用方法摘要

    String getProtocol()获取此 URL的协议名称。
    String getHost() 获取此 URL 的主机名。
    int getPort() 获取此 URL 的端口号。
    String getPath() 获取此 URL 的文件路径。
    String getFile()获取此 URL 的文件名。
    String getQuery()获取此 URL的查询部分。
    URLConnection openConnection() 返回一个URLConnection实例,表示与URL引用的远程对象的URL 。

    • URLConnection类中又有一个方法:
      InputStream getInputStream() 返回从此打开的连接读取的输入流。

    案例演示1

    import java.net.MalformedURLException;
    import java.net.URL;
    
    public class Test {
        public static void main(String[] args) throws MalformedURLException {
            URL url = new URL("http://localhost:8080/index.jsp?username=Tom&password=123456");
            System.out.println(url.getProtocol());//获取协议名
            System.out.println(url.getHost());//获取主机名
            System.out.println(url.getPort());//获取端口号
            System.out.println(url.getPath());//获取文件路径
            System.out.println(url.getFile());//获取文件名
            System.out.println(url.getQuery());//获取查询名
        }
    }
    

    在这里插入图片描述
    案例演示2
    URL下载网络资源

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class Test {
        public static void main(String[] args) throws IOException {
            //下载地址
            URL url = new URL("https://img.t.sinajs.cn/t6/style/images/global_nav/WB_logo.png?id=1404211047727");
            //连接到这个资源 HTTP
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            InputStream is = urlConnection.getInputStream();
            FileOutputStream fos = new FileOutputStream("weibo.jpg");
            byte[] buffer = new byte[1024];
            int len=0;
            while ((len=is.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }
            //释放资源
            urlConnection.disconnect();//断开连接
            is.close();
            fos.close();
        }
    }
    

    小结

    在这里插入图片描述

    展开全文
  • 网络编程面试题(2020最新版)

    万次阅读 多人点赞 2020-03-16 17:36:28
    TCP/IP 协议族应用层运输层网络层数据链路层物理层TCP/IP 协议族TCP的三次握手四次挥手TCP报文的头部结构三次握手四次挥手常见面试题为什么TCP连接的时候是3次?2次不可以吗?为什么TCP连接的时候是3次,关闭的时候...

    Java面试总结(2021优化版)已发布在个人微信公众号【技术人成长之路】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了精简优化,欢迎大家关注!😊😊

    【技术人成长之路】,助力技术人成长!更多精彩文章第一时间在公众号发布哦!

    计算机网络体系结构

    在计算机网络的基本概念中,分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多,在学习时要多思考。这些概念对后面的学习很有帮助。

    网络协议是什么?

    在计算机网络要做到有条不紊地交换数据,就必须遵守一些事先约定好的规则,比如交换数据的格式、是否需要发送一个应答信息。这些规则被称为网络协议。

    为什么要对网络协议分层?

    • 简化问题难度和复杂度。由于各层之间独立,我们可以分割大问题为小问题。
    • 灵活性好。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受影响。
    • 易于实现和维护。
    • 促进标准化工作。分开后,每层功能可以相对简单地被描述。

    网络协议分层的缺点: 功能可能出现在多个层里,产生了额外开销。

    为了使不同体系结构的计算机网络都能互联,国际标准化组织 ISO 于1977年提出了一个试图使各种计算机在世界范围内互联成网的标准框架,即著名的开放系统互联基本参考模型 OSI/RM,简称为OSI。

    OSI 的七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用,TCP/IP 体系结构则不同,但它现在却得到了非常广泛的应用。TCP/IP 是一个四层体系结构,它包含应用层,运输层,网际层和网络接口层(用网际层这个名字是强调这一层是为了解决不同网络的互连问题),不过从实质上讲,TCP/IP 只有最上面的三层,因为最下面的网络接口层并没有什么具体内容,因此在学习计算机网络的原理时往往采用折中的办法,即综合 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚,有时为了方便,也可把最底下两层称为网络接口层。

    四层协议,五层协议和七层协议的关系如下:

    • TCP/IP是一个四层的体系结构,主要包括:应用层、运输层、网际层和网络接口层。
    • 五层协议的体系结构主要包括:应用层、运输层、网络层,数据链路层和物理层。
    • OSI七层协议模型主要包括是:应用层(Application)、表示层(Presentation)、会话层(Session)、运输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。

    在这里插入图片描述

    注:五层协议的体系结构只是为了介绍网络原理而设计的,实际应用还是 TCP/IP 四层体系结构。

    TCP/IP 协议族

    应用层

    应用层( application-layer )的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。

    对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。

    运输层

    运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。

    运输层主要使用一下两种协议

    1. 传输控制协议-TCP:提供面向连接的,可靠的数据传输服务。
    2. 用户数据协议-UDP:提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
    UDPTCP
    是否连接无连接面向连接
    是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
    连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信
    传输方式面向报文面向字节流
    首部开销首部开销小,仅8字节首部最小20字节,最大60字节
    场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输

    每一个应用层(TCP/IP参考模型的最高层)协议一般都会使用到两个传输层协议之一:

    运行在TCP协议上的协议:

    • HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。
    • HTTPS(HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本。
    • FTP(File Transfer Protocol,文件传输协议),用于文件传输。
    • POP3(Post Office Protocol, version 3,邮局协议),收邮件用。
    • SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件。
    • TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络。
    • SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用。

    运行在UDP协议上的协议:

    • BOOTP(Boot Protocol,启动协议),应用于无盘设备。
    • NTP(Network Time Protocol,网络时间协议),用于网络同步。
    • DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。

    运行在TCPUDP协议上:

    • DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作。

    网络层

    网络层的任务就是选择合适的网间路由和交换结点,确保计算机通信的数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称数据报。

    互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或 IP 层。

    数据链路层

    数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。

    在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。

    在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。

    一般的web应用的通信传输流是这样的:

    img

    发送端在层与层之间传输数据时,每经过一层时会被打上一个该层所属的首部信息。反之,接收端在层与层之间传输数据时,每经过一层时会把对应的首部信息去除。

    物理层

    在物理层上所传送的数据单位是比特。 物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

    TCP/IP 协议族

    在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定是单指 TCP 和 IP 这两个具体的协议,而往往是表示互联网所使用的整个 TCP/IP 协议族。

    img

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

    划重点:

    TCP(传输控制协议)和IP(网际协议) 是最先定义的两个核心协议,所以才统称为TCP/IP协议族

    TCP的三次握手四次挥手

    TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务端保存的一份关于对方的信息,如ip地址、端口号等。

    TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。

    一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个链接,通过四次挥手来关闭一个连接

    当一个连接被建立或被终止时,交换的报文段只包含TCP头部,而没有数据

    TCP报文的头部结构

    在了解TCP连接之前先来了解一下TCP报文的头部结构。

    TCPHeader.png

    上图中有几个字段需要重点介绍下:

    (1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

    (2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

    (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:

    • ACK:确认序号有效。
    • FIN:释放一个连接。
    • PSH:接收方应该尽快将这个报文交给应用层。
    • RST:重置连接。
    • SYN:发起一个新连接。
    • URG:紧急指针(urgent pointer)有效。

    需要注意的是:

    • 不要将确认序号ack与标志位中的ACK搞混了。
    • 确认方ack=发起方seq+1,两端配对。

    三次握手

    三次握手的本质是确认通信双方收发数据的能力

    首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了我的发件能力和他的收件能力是可以的

    于是他给我回信,我若收到了,我便知我的发件能力和他的收件能力是可以的,并且他的发件能力和我的收件能力是可以

    然而此时他还不知道他的发件能力和我的收件能力到底可不可以,于是我最后回馈一次,他若收到了,他便清楚了他的发件能力和我的收件能力是可以的

    这,就是三次握手,这样说,你理解了吗?

    三次握手.png

    • 第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号ISN(比如是100),那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1),序列号seq=100。
    • 第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号100存起来,并且随机生成一个服务端的起始序列号(比如是300)。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发过来的序列号+1)。
    • 第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号300给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次seq就从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101)。当服务端收到报文后发现ACK=1并且ack=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。

    四次挥手

    四次挥手的目的是关闭一个连接

    四次挥手.jpeg

    比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。

    • 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。
    • 第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
    • 第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。
    • 第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。

    常见面试题

    为什么TCP连接的时候是3次?2次不可以吗?

    因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。

    如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文。

    为什么TCP连接的时候是3次,关闭的时候却是4次?

    因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。

    为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

    这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了。

    如果已经建立了连接,但是客户端突然出现故障了怎么办?

    TCP设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

    什么是HTTP,HTTP 与 HTTPS 的区别

    HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

    区别HTTPHTTPS
    协议运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份身披 SSL( Secure Socket Layer )外壳的 HTTP,运行于 SSL 上,SSL 运行于 TCP 之上, 是添加了加密和认证机制的 HTTP
    端口80443
    资源消耗较少由于加解密处理,会消耗更多的 CPU 和内存资源
    开销无需证书需要证书,而证书一般需要向认证机构购买
    加密机制共享密钥加密和公开密钥加密并用的混合加密机制
    安全性由于加密机制,安全性强

    常用HTTP状态码

    HTTP状态码表示客户端HTTP请求的返回结果、标识服务器处理是否正常、表明请求出现的错误等。

    状态码的类别:

    类别原因短语
    1XXInformational(信息性状态码) 接受的请求正在处理
    2XXSuccess(成功状态码) 请求正常处理完毕
    3XXRedirection(重定向状态码) 需要进行附加操作以完成请求
    4XXClient Error(客户端错误状态码) 服务器无法处理请求
    5XXServer Error(服务器错误状态码) 服务器处理请求出错

    常用HTTP状态码:

    2XX成功(这系列表明请求被正常处理了)
    200OK,表示从客户端发来的请求在服务器端被正确处理
    204No content,表示请求成功,但响应报文不含实体的主体部分
    206Partial Content,进行范围请求成功
    3XX重定向(表明浏览器要执行特殊处理)
    301moved permanently,永久性重定向,表示资源已被分配了新的 URL
    302found,临时性重定向,表示资源临时被分配了新的 URL
    303see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源(对于301/302/303响应,几乎所有浏览器都会删除报文主体并自动用GET重新请求)
    304not modified,表示服务器允许访问资源,但请求未满足条件的情况(与重定向无关)
    307temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
    4XX客户端错误
    400bad request,请求报文存在语法错误
    401unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
    403forbidden,表示对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述
    404not found,表示在服务器上没有找到请求的资源
    5XX服务器错误
    500internal sever error,表示服务器端在执行请求时发生了错误
    501Not Implemented,表示服务器不支持当前请求所需要的某个功能
    503service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求

    GET和POST区别

    说道GET和POST,就不得不提HTTP协议,因为浏览器和服务器的交互是通过HTTP协议执行的,而GET和POST也是HTTP协议中的两种方法。

    HTTP全称为Hyper Text Transfer Protocol,中文翻译为超文本传输协议,目的是保证浏览器与服务器之间的通信。HTTP的工作方式是客户端与服务器之间的请求-应答协议。

    HTTP协议中定义了浏览器和服务器进行交互的不同方法,基本方法有4种,分别是GET,POST,PUT,DELETE。这四种方法可以理解为,对服务器资源的查,改,增,删。

    • GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。
    • POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。
    • PUT:英文含义是放置,也就是向服务器新添加数据,就是所谓的增。
    • DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程。

    GET和POST区别

    1. Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。 但是这种做法也不时绝对的,大部分人的做法也是按照上面的说法来的,但是也可以在get请求加上 request body,给 post请求带上 URL 参数。

    2. Get请求提交的url中的数据最多只能是2048字节,这个限制是浏览器或者服务器给添加的,http协议并没有对url长度进行限制,目的是为了保证服务器和浏览器能够正常运行,防止有人恶意发送请求。Post请求则没有大小限制。

    3. Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。

    4. Get执行效率却比Post方法好。Get是form提交的默认方法。

    5. GET产生一个TCP数据包;POST产生两个TCP数据包。

      对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

      而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

    什么是对称加密与非对称加密

    对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;

    而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
    由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢

    什么是HTTP2

    HTTP2 可以提高了网页的性能。

    在 HTTP1 中浏览器限制了同一个域名下的请求数量(Chrome 下一般是六个),当在请求很多资源的时候,由于队头阻塞当浏览器达到最大请求数量时,剩余的资源需等待当前的六个请求完成后才能发起请求。

    HTTP2 中引入了多路复用的技术,这个技术可以只通过一个 TCP 连接就可以传输所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能。

    Session、Cookie和Token的主要区别

    HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。

    什么是cookie

    cookie是由Web服务器保存在用户浏览器上的小文件(key-value格式),包含用户相关的信息。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户身份。

    什么是session

    session是依赖Cookie实现的。session是服务器端对象

    session 是浏览器和服务器会话过程中,服务器分配的一块储存空间。服务器默认为浏览器在cookie中设置 sessionid,浏览器在向服务器请求过程中传输 cookie 包含 sessionid ,服务器根据 sessionid 获取出会话中存储的信息,然后确定会话的身份信息。

    cookie与session区别

    • 存储位置与安全性:cookie数据存放在客户端上,安全性较差,session数据放在服务器上,安全性相对更高;
    • 存储空间:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,session无此限制
    • 占用服务器资源:session一定时间内保存在服务器上,当访问增多,占用服务器性能,考虑到服务器性能方面,应当使用cookie。

    什么是Token

    Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。

    Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

    使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

    Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位

    session与token区别

    • session机制存在服务器压力增大,CSRF跨站伪造请求攻击,扩展性不强等问题;
    • session存储在服务器端,token存储在客户端
    • token提供认证和授权功能,作为身份认证,token安全性比session好;
    • session这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上,token适用于项目级的前后端分离(前后端代码运行在不同的服务器下)

    Servlet是线程安全的吗

    Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。

    解决的办法是尽量不要定义name属性,而是要把name变量分别定义在doGet()和doPost()方法内。虽然使用synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。

    注意:多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型的。

    Servlet接口中有哪些方法及Servlet生命周期探秘

    在Java Web程序中,Servlet主要负责接收用户请求HttpServletRequest,在doGet()doPost()中做相应的处理,并将回应HttpServletResponse反馈给用户。Servlet可以设置初始化参数,供Servlet内部使用。

    Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关

    • void init(ServletConfig config) throws ServletException
    • void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
    • void destory()
    • java.lang.String getServletInfo()
    • ServletConfig getServletConfig()

    生命周期:

    Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;

    请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;

    当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法

    init方法和destory方法只会执行一次,service方法客户端每次请求Servlet都会执行。Servlet中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。

    如果客户端禁止 cookie 能实现 session 还能用吗?

    Cookie 与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。

    但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。

    假定用户关闭Cookie的情况下使用Session,其实现途径有以下几种:

    1. 手动通过URL传值、隐藏表单传递Session ID。
    2. 用文件、数据库等形式保存Session ID,在跨页过程中手动调用。
    展开全文
  • 网络编程】Socket网络编程基础

    千次阅读 2019-06-12 21:41:50
    文章目录网络编程概述Socket与TCP UDPSocket TCP演示报文段协议Mac地址IP、端口、远程服务器IPv4IPv6端口远程服务器 网络编程概述 什么是网络编程 网络编程从大的方面说就是对信息的发送到接收 通过操作相应Api调度...
  • java 网络编程的网络模型7介绍:

    千次阅读 2017-12-01 18:01:43
    物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模...
  • 物理层协议

    千次阅读 2019-03-23 21:42:53
    百度百科 Table of Contents ...物理层(或称物理层,Physical Layer)是计算机网络OSI模型中最低的一层。物理层规定:为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,...
  • 物理层到底在干什么

    千次阅读 2019-05-27 20:44:50
    OSI参考模型中将网络划分为7个层级,其中物理层属于最底层,但是物理层也是最重要的一层,因为其他层级都是建立在物理层之上的,所以物理层可以看作是金字塔的底部。物理层基本工作内容物理层利用传输介质为通信的两...
  • 为了说清楚我们将要讲解的基础知识,我们首先来看一下OSI 7层网络模型。1、链路报文链路的数据格式有一个共同特点,都包括目标MAC地址和源MAC地址。下面这个图主要说明了我们最常用的Ethernet帧(以太帧)的报文...
  • 网络编程模型及网络编程三要素

    千次阅读 2016-05-08 19:13:50
    网络编程模型及网络编程三要素
  • 【带你入门】java网络编程

    万次阅读 多人点赞 2018-02-18 12:10:41
    网络编程网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习。在 学习网络编程以前,很多初学者可能觉得网络编程是...
  • 老曹眼中的网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为我们拥有网络。网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界。 然而,网络的无标度...
  • 【Linux网络编程】网络基础知识

    千次阅读 多人点赞 2019-11-10 17:25:13
    00. 目录 文章目录00....有 7 个 OSI 层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。 3)什么是骨干网? 骨干网络是集中的基础设施,旨在将不同的路由和数据分发到各种网络。...
  • 物理层

    千次阅读 2012-11-14 19:45:53
    物理层 科技名词定义 中文名称:物理层 英文名称:physical layer 定义:在开放系统互连(OSI)模型中的第一层,为通信提供实现透明传输的物理链接。 应用学科:通信科技(一级学科);通信协议...
  • 网络编程学习总结

    千次阅读 2016-03-19 12:05:21
    网络编程 1、网络编程基本概念 2、网络编程TCP协议 3、TCP实现ECHO程序 4、服务器与多客户端通信 5、多客户端之间的通信 6、URL 7、HttpURLConnection接口 8、UDP
  • 网络编程-网路七协议图

    千次阅读 2017-08-04 22:36:34
    网路七协议图 了解网络协议(Network Protocol)之间的关系对网络...这些网络协议图虽然遵循OSI七层网络协议,但是对于网络协议分类并不清晰,特别对于 TCP/IP协议不够直观。另一方面,现在网上能找到的协议图
  • Java Language——网络编程

    千次阅读 多人点赞 2016-05-21 15:26:00
    计算机网络主要功能包括资源共享、信息传输和集中处理、负载均衡和...实际上 Java 的网络编程就是服务器通过 ServerSocket 建立监听,客户端通过 Socket 连接到指定服务器后,通信双方就可以通过 IO 流进行通信了。
  • 网络编程

    千次阅读 2019-04-12 21:17:58
    网络编程就是如何在程序中实现两台计算机的通信。 TCP/IP简介 1、TCP/IP协议族 链路:处理与电缆或其他传输媒介的物理接口。 网络:处理数据在网络中的活动。  ip协议——>网络互连协议  用途:将多个包在...
  • 一、网络编程 软件开发架构  C/S架构  C:客户端 想体验服务的时候才会去找服务端体验服务  S:服务端 24小时不间断的提供服务,即时监听,随时待命  B/S架构  B:浏览器 想体验服务的时候才会去找...
  • iOS面试之网络编程

    千次阅读 2018-04-02 15:40:51
    网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 其中物理层、数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象; 传输层、会话层、表示层和应用层则被称作...
  • Linux网络编程

    千次阅读 2016-07-07 20:12:57
    Linux网络编程 ...ISO/OSI的七层模型(由上到下):应用层(APDU),表示层(PPDU),会话层(SPDU),传输层(TPDU),网络层(报文),数据链路层(帧),物理层(比特),分层的目的主要是为了便于管理。
  • java网络编程

    千次阅读 2018-09-09 15:37:05
    网络编程基础 网络编程的目的: 直接或间接地通过网络协议与其它计算机进行通讯。 网络编程中有两个主要的问题: Ø如何准确地定位网络上一台或多台主机 Ø找到主机后如何可靠高效地进行数据传输。 如何实现网络中...
  • 以太网物理层信号测试与分析

    万次阅读 多人点赞 2018-05-06 20:06:08
    要想透彻掌握以太网测试要领,必须首先了解以太网物理层信号的基本特点。基于此,本文将具体介绍三种速率以太网标准的不同物理层编码规则、完整测试涉及到的共性问题,以及基于力科示波器的以太网一致性测试方案。 ...
  • Java网络编程

    万次阅读 2015-11-19 19:17:15
    Java网络编程 java网络编程基础知识 1、协议(TCP/IP)  TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是...
  • 浅谈网络编程中的常见问题

    万次阅读 2019-08-27 17:43:47
    OSI七层模型 OSI七层协议模型主要是: 应用层(Application) 表示层(Presentation) ...物理层(Physical) 2.TCP/IP五层模型 TCP/IP五层模型: 应用层(Application) 传输层(Transport) 网络层(Network...
  • C#网络编程(Socket编程)

    千次阅读 多人点赞 2020-04-02 09:45:27
    一、Socket网络编程 1.Socket是什么? 在计算机通信领域,Socket被译为“套接字”。它是计算机之间进行通信的一种约定或一种方式。通过Socket这种约定可以接收到其他计算机的数据,也可以向其他计算机发送数据。 2....
  • 【Linux网络编程】网络协议入门

    千次阅读 多人点赞 2019-11-10 18:03:45
    物理层04. 数据链路层05. 网络层06. 传输层07. 应用层08. 附录 01. 前言 我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信。北京的某一块网卡送出信号,深圳的另一块...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,578
精华内容 39,031
热门标签
关键字:

网络编程物理层