zoukankan      html  css  js  c++  java
  • 计算机网络的传输层的简单介绍:

    在应用层下为传输层,如TCP与UDP;

    传输层与网络层之间的不同: 传输层负责信息在主机进程与服务器进程之间的传递; 网络层负责信息在主机与服务器之间的传递;     差了一个进程啊;

    传输层的信息用:segment 表示;它是这样得到的:把应用层的message 分成一块块,然后再加上传输层的文件头;

    另外,TCP的信息也会用segment表示,UDP的信息用datagram(数据报)表示;网络层上的message也用datagram表示;

    UDP:user datagram protocol; 它只会进行两个服务:1, 进程之间的数据交付;2,error checking;

    TCP: transmission control protocol; 它进行的服务比较多,因为它是可靠传输;如:数据流控制等;

    多路复用与多路分解:

    由于传输层的作用是把信息交付给不同的socket, 所以呢,在应用层与传输层之间需要用到了多路复用与多路分解;

    多路复用指:不同的socket的信息加入身份确认标志,统统变为为segment,然后用传输层交给了下面的网络层进行传送;

    多路分解指:把很多segment交付给不同的socket;

    要求:1, 存在不同的socket以及对应的端口;2, 每一个segment上应该用用于identify的field,里面的信息为源端口与目的端口;

    (补:端口的范围为0-65536,其中0-1023不能随便用,因为它是专用的,如HTTP等 或保留着呢,其它的可以随意用了;)

    在一个传输层的segment中的用于识别的字段结构如下图,头占了8个字节:

    image

    无连接的多路利用/分解与面向连接的多路利用/分解

    UDP的多路利用/分解:一个UDP socket使用目的主机的IP与目的主机的端口来确定;

    TCP的socket:由源IP、源端口、目的IP、目的端口来确定;(一开始的握手segment除外), 所以呢,TCP的socket可以有相同的端口,如WEB服务器的端口好像都是80吧(无端建立连接的socket还是用于传输数据的socket);

    UDP:

    很简单,它把应用层的数据加一个头就变为了UDP的segment. 它的segment的结构如下图所示:

    image

    它的头包括4个fields, 每一个field的大小为:2字节;内容分别为: 源端口,目的端口,数据的长度和checksum(用于纠错);

    下面的application data,为应用层的数据;

    可靠的传输:

    问题1:如何解决发送的packet有误的问题??

    解决方法:版本1:当receive收到消息以后,就回复一个ACK(acknowledgment), 如果没有收到的消息出错了,就发送一个NAK,表示让发送者再重新发一遍;

                  进级:为每一个信息加一个sequence numbeer, 当收到的信息有误时,不发送该消息的NAK了,而是发送上一个收到的正确的消息的ACK;

    问题2: packet在发送过程中,如果Loss怎么办?

    解决方法:加入消息重发机制; 当数据loss后,发送者肯定就收不到ACK信息了, 加入一个计时器timer,超过一定的时间就重发;

    问题3:如何提高传输的效率?

    解决方法:采用流水线设计,具体为: go back N 和 selective repreat;

    (里面有一些细节,省略不写,例如:要求未回应的信息的个数不大于N,等)

    TCP:

    它的结构如下图:

    image

    它的头,占了20个字节;

    总的来看TCP, 

    最主要的三点吧:

    第一,如何进行可靠的传输,包括内容与顺序; 解决方法:对于错误的或loss的进行重传, 对于不是顺序的可以进行丢弃或缓存下来;

    其中,怎么判断的问题:一个是timeout,一个是收到3个同一字段有ACK;   对于ACK,TCP采用的是accumulative 的方法,这一点很重要的;

    另外的怎么计算timeout的时间啦,怎么重发等细节省略;

    第二点:  对于如何解决flow 问题与confession问题,方法基本相同,就是控制发送方的rate(或窗口大小), 但是两者的原因不同,一个是因为接收者上层应用接收的慢,一个是由于网络堵塞; 对于如何把出现上述原因的情况反馈给发送者呢: 前者使用ACK信息里的的相应字段来解决;后者根据ACK到达发送者的状态,如loss了,还是收到了3个多余的重复的ACK来判断,其中当然还有细节;

    第三点: 如何使用流水线进行提高效率的问题:关键字:并行发,consequence number, ACK number, 还有一个发送窗口;

    另外,对于三次握手的建立过程的原理,字段的作用等,也很有意思;可以利用这个原理写端口扫描工具啦,进行网络攻击等;

    ###################      2017年9月补          ########################

    一、 了解端口号:

    1.了解端口号; 0-1023为周知端口号;

    2. 一个UDP的套接字由目的IP地址与目的端口号来全面标识; TCP的套接字由源端口号、源IP地址、目的端口号、目的IP地址来识别;

    3. 在这一层,数据常被称为报文段;

    二、 UDP协议:

    1. 使用DUP协议的例子:

    image

    2. UDP的报文段结构

    image

    如图所示:首部由4个字段组成,每个字段2个字节;

    长度:包括首部在内的全部的UDP的报文段长度,单位为字节;

    3.

    三、可靠数据传输:

    1、 ARQ协议,自动重传请求协议;收到消息后,给一个应答来告诉是否收到了,收到回答ACK, 没有听清回答NAK;

    2. 后来改进:加入了一个seq, 收到了就回答对应的seq,没有收到或收到错误的什么也不干, 因为加入了一个定时器,超时就重传;

    3. 一个一个的传有点慢,采用了流水线的形式,然后,对于差错恢复问题的两个基本方法:GBN(回退N步)协议和SR(选择重传)协议;

      GBN协议:只要是不是按顺序到的分组,全部都丢弃; SR协议中则会缓存到一个地方;

    4. 一个重的的控制传输多少个分组的:滑动窗口协议;

    四、 TCP协议

    1. TCP报文段对构:

    image

    32比特的序号与确认号:  image

    16比特的接收窗口: image

    4比特的首部长度:image

    可选与变长的选项字段:image

    6比特的标志字段:

    • ACK:确认位,只有ACK=1的时候ack才起作用。正常通信时ACK=1,第一次发起请求时因为没有需要确认接收的数据所以ACK为0。
    • SYN:同步位,用于在建立连接时同步序号。刚开始简历连接时并没有历史接收的数据,所以ack就没办法设置,这时按照正常的机制就无法运行了,SYN的作用就是来解决这个问题的,当接收端接收到SYN=1的报文时就会直接将ack设置为接收到的seq+1的值,注意这里的值并不是校验后设置的,而是根据SYN直接设置的,这样正常的机制就可以运行了,所以SYN叫同步位。需要注意的是,SYN会在前两次握手时都为1,这是因为通信的双方的ack都需要设置一个初始值。
    • FIN:终止位,用来在传输数据完毕后释放连接。
    • RST 置1时重建连接。如果接收到RST位时候,通常发生了某些错误。
    • ACK 置1时表示确认号(为合法,为0的时候表示数据段不包含确认信息,确认号被忽略。
    • PSH 置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。
    • URG(紧急位): 急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。T C P的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据,不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲的)                           其中URG不能和PSH标志位同时使用,也对;因为紧急数据后面的要进缓冲区的;

    16比特的紧急数据指针:用于指出紧急数据的最后一个字节位置;

    TCP要传输的数据的最大值叫做最大报文段长(MSS); 它指的是最大的应用数据的长度, 不是包括TCP头部的最大TCP报文长度;MSS的大小受限于MTU;

    image

    2. TCP连接的建立与断开

    建立连接:image

    断开连接:image

    3. TCP拥塞的控制:

    参考这里: 写的很好;

      TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免

    参考:计算机网络第六版,自顶向下;

  • 相关阅读:
    用户控件JS问题
    jQuery formValidator自定义函数扩展功能
    IAR使用notice
    C++入门学习
    解决Myeclipse闪退问题
    Cortex_M3——存储器系统学习笔记
    加密算法中涉及C/C++总结
    学习笔记——应用密码学基础
    keil软件相关问题汇总
    STM32知识点纪要
  • 原文地址:https://www.cnblogs.com/yinheyi/p/7097161.html
Copyright © 2011-2022 走看看