zoukankan      html  css  js  c++  java
  • 自顶向下---运输层

    同为端到端的通信,传输层与网络层的区别是什么?
    任务:负责向两个主机中应用进程之间的通信提供服务(提供逻辑通信)。
    区别:运输层为运行在不同主机上的进程之间提供端到端的逻辑通信,但网络层是提供主机之间的逻辑通信
     

    一、多路分解与多路复用

      每个运输层的报文段中设置了几个字段,包括源端口号和目的端口号等。多路分解就是,在接收端,运输层检查这些字段并标识出接收套接字,然后将该报文定向到该套接字。其工作方式可以简单地认为是这样的,主机上的每个套接字被分配一个端口号,当报文到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字。多路复用就是从源主机的不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层中去。

    1、无连接的多路复用和多路分解

      在运输层,无连接的网络传输是通过UDP来实现的。UDP报文中只有源端口号和目的端口号,一个UDP套接字是由一个含有目的IP地址和目的端口号的二元组来全面标识的。在客户端,源端口号是客户进程套接字的端口号,目的端口号是服务器的端口号。而在服务器端,源端口号是服务器的创建的套接字的端口号,而目的端口号是客户端的套接字的端口号。

      注意:使用UDP来传输报文段时,一个UDP套接字是由一个含有目的IP地址和目的端口号的二元组来全面标识的。因此,如果两个UDP报文段有不同的源IP地址和源端口,但具有相同的源IP地址和目的端口号,那么这两个报文段将通过相同的目的端口号定向到相同的目的进程。这里没有过多地说明IP地址,是因为IP地址是网络层的知识,所以没有提及,我们现在只须知道,IP地址对应着一台主机,而端口号对应着一台主机上的一个进程(或套接字)。

    2、面向连接的多路复用和多路分解

      网络上主机间的进程间通信,实质上是通过套接字来实现的。在运输层中面向连接的网络传输多使用TCP,而TCP套接字和UDP套接字之间有一个细微的差别,就是,TCP套接字是由一个四元组(源IP地址、源端口号,目的IP地址,目的端口号)来标识的。这样,当一个TCP报文段从网络到达一台主机时,主机会使用全部4个值来将报文段定向,即多路分解到相应的套接字。
      与UDP不同的是,两个具有不同源IP或源端口号的到达的TCP报文段将被重定向到两个不同的套接字
      尽管如此,而TCP的多路利用和多路分解的工作原理与无连接的UDP的多路复用和多路分解的原理还是大致一样的。
       
      想想为什么TCP的多路复用和多路分解要这样设计呢?
      这是因为TCP和UDP对待接收到的数据的处理方式不同所致的。我们以服务器上的TCP套接字和UDP套接字为例,假定服务器接收客户端的数据,并把数据发送回客户端。当一个UDP服务器接收到一个UDP报文段时,它会根据收到的UDP报文段的源IP和源端口号,把数据发送回客户端,它并不需要创建一个新的套接字来处理该报文段;而对于一个TCP服务器,当它接受一个连接时,它会产生一个新的套接字,然后通过新的套接字来与客户端通信,也就是通过新的套接字来把数据发送回给客户端。由于每一个连接都会产生一个新的套接字,所以具有不同的源IP或源端口号的连接就是一个不同的连接,对应着产生的新的不同的套接字

    二、UDP

      UDP(用户数据报协议,User Datagram Protocol),它只是做了运输层协议能够做的最少工作,除了多路复用多路分解及一些差错检测外,它几乎没有做任何东西。如果应用程序使用的运输层协议是UDP,则应用程序几乎是直接与IP打交道的。
     
      同时,UDP也是一种无连接的运输层协议,因为在使用UDP时,在发送报文段之前,发送方和接收方的运输层实体之间没有进行握手,所谓的握手,就是发送方和接收方通过发送一些特定的报文段来互相确认,从而为发送做准备。
     
      UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP是不可靠的数据报协议),也不要求接收方回复接收成功确认,也不会重发数据,不提供流量控制,更不提供拥塞控制。UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)。

    UDP报文段结构

      从上图可以看出,UDP首部只有4个字段,每个字段由两个字节组成。
       源端口号:本机(客户端)的应用程序的套接字所对应的端口号,服务器端可利用此端口号向客户端发送数据。
       目的端口号:服务端上的应用进程的套接字所对应的端口号,例如HTTP服务器的80端口。
       长度:指明了首部和数据部分的UDP报文段的总长度,单位为字节,即首部+数据。
       检验和:提供了差错检测功能,即检验和用于确定当UDP报文段从源到达目的时,其中的比特是否发生了改变。事实上,计算检验和时,除了UDP报文段以外还使用了IP首部的一些字段。注意,它只能检测到一个报文段发生了错误,但并不能纠正这个错误。  

    UDP的优势

      从UDP的概述中,我们可以看到,UDP其实并不提供什么服务,而TCP则为我们提供了非常吸引的服务(如数据备份、重发机制、流量控制、接收确认、拥塞控制等等),实现的是一个可靠的传输。为什么还在存在UDP这个东西呢?每一样事物都有它的优点,而且很多时候,事物的缺点恰恰就是它的优点。我为何这么说,下面就来看看它的优势吧!
      1、应用层能更好发控制要发送的数据和发送时间。
      为什么采用UDP的应用层能更好地控制发送的数据和时间呢?因为UDP只提供最简单、服务最少的服务,所以当网络应用进程有数据传递给UDP时,UDP马上就会将此数据打包成UDP报文段,并把它交付给网络层,从而把数据发送出去。相反,由于TCP提供了各种的机制,特别是拥塞控制,以便让源和目的主机间的一条或多条链路变得非常拥塞时,遏制运输层TCP发送方,从而让因特网电话、视频会议之类的实时应用性能变得很差。再者,TCP还会继续重发数据报文段直到目的主机收到此报文并加以确认,点面结合 不管可靠的交付需要多少时间。TCP的这些特性,对于一些实时应用来说通常是不适合的,因为它们通常要求以最快的发送速率发送数据,而不想过分地延迟报文的传送,而且它还能容忍一些数据丢失,所以没用必要使用TCP,使用TCP还会增加额外的负担。
      2、无需连接建立
      如上述的那样,UDP是一个无连接的运输层协议,而TCP在开始数据传输之前要经过三次握手。UDP由于它是一个无连接的协议,所以可以不需要任何准备即可进行数据传输,因此它不会引入建立连接的时延。所以DNS运行在UDP之上而不是TCP之上,因为如果DNS运行在TCP之上,则会由于要建立过多的连接而产生过长连接延时,从而让DNS运行得很慢。
      3、无连接状态
      TCP由于在提供各种可靠传输的服务,需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数、序号与确认序号等参数。而UDP不维护连接状态,也不跟踪这些参数。因此,使用UDP的服务器能支持更多的活动客户机。
      4、分组首部开销小
      由于UDP提供的服务少,只提供多路分解和多路复用和校验功能,所以其首部字段少,只有8个字节,而TCP的首部有20个字节。

    三、TCP

      TCP作为一个可靠的连接协议最大的特点就是面向连接的,即在发送数据之间要建立连接,数据传输过程中要维护连接,数据发送完毕之后要释放连接。在此基础上TCP提供可靠的传输:
    1. 可靠交付:TCP传递的数据无差错、无丢失、无重复、且按序到达;
    2. 全双工通信:TCP通信的每一段都维护着一个发送缓存接收缓存
    3. 面向字节流:TCP协议把上层交付的应用层数据单纯地看成是一系列无结构的字节流;
         TCP连接的端点不是主机中的应用进程,而是应用进程维护的套接字接口(socket),其基本的结构包含【IP:Port】;
    TCP报文格式如下:

    • 源端口或目的端口(分别2个字节):略。
    • 序号(4个字节):TCP连接中传送的字节流中的每一个字节都按顺序编号。传送的字节流的起始序号必须在连接建立时设置。报文段中的序号值是本报文段所发送的数据的第一个字节的编号。例如一报文段序号值为101,数据共有100字节,那么下一报文段序号值就为201。因为序号的大小是[0,2^32 -1],超出了循环从0开始,所以序号是使用mod2^32运算的。
    • 确认号(4个字节):期望收到对方下一个报文段的第一个数据字节的序号。
    • 数据偏移(又称首部长度)(4位):指出TCP报文段的数据起始处距离TCP首部的起始处有多远。实际上就是指出TCP首部长度。该字段指示了以32bit的字为单位的TCP首部长度。由于TCP选项字段的原因,TCP首部的长度是可变的。因此,数据偏移的单位是4个字节,而4位二进制的最大值是15,则说明首部最大只能是15*4=60字节。其实选项字段最大只能为40字节。
    • 保留(6位):略。
    • 紧急URG:表明紧急指针子字段有效。
    • 确认ACK:等于1时确认号字段才有效。TCP规定连接建立后所有传送报文度必须把ACK置1。
    • 推送PUSH:表明需要尽快地交付接收应用进程,不再等整个缓存都填满后再向上交付。
    • 复位RST:等于1时表明TCP连接中出现严重差错,必须释放连接再重新建立。
    • 同步SYN:用于连接建立时同步序号的。
    • 终止FIN:用来释放一个连接。
    • 窗口(2个字节):该字段用于流量控制,指示接收方愿意接收的字节数量。因为接收方的接收缓存有限。窗口值是动态变化的。
    • 检验和(2个字节):检验和检查的范围包括首部和数据。
    • 紧急指针(2个字节):指出紧急数据的末尾在报文段中的位置。即使窗口值为零也可以发送紧急数据。
    • 选项(最大可达40个字节):略。
     
     未完待续。。。。。
     
     
     计算机网络笔记-TCP层 - macdroid的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/macdroid/article/details/49070185
     计算机网络【六】:传输层-TCP概述-windhawkgyang-ChinaUnix博客 http://blog.chinaunix.net/uid-26275986-id-4109209.html
    计算机网络复习笔记五之运输层_红孩儿_新浪博客 http://blog.sina.com.cn/s/blog_a7f4cc6101015c32.html
     
  • 相关阅读:
    开博了,将会定期更新博客
    C++实验二
    C++实验三
    c++第八章课后题
    c++第八章复数运算
    我的第一篇Window Live Writer日志
    Item 3: Prefer the is or as Operators to Casts(选择is或者as操作符而不是做强制类型转换)
    C# 中list的排序
    CodeSmith的应用
    using 关键字
  • 原文地址:https://www.cnblogs.com/wujing-hubei/p/6035776.html
Copyright © 2011-2022 走看看