zoukankan      html  css  js  c++  java
  • 计算机网络-自顶向下方法第三章

    第二章讲应用层,这一章讲的是运输层。

    运输层位于应用层和网络层之间。因此,简单了解一下网络层,对于了解运输层是有帮助的。

    3.1 概述和运输层服务

      运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信功能。

    运输层协议是在端系统中而不是在路由器中实现的。在发送端,运输层将从发送应用程序接收到的报文转化成运输层分组——运输层报文段(segment)。在发送端系统中,运输层将这些报文段传递给网络层,网络层将其封装成网络层分组(数据报)并向目的地发送。

      网络应用程序会用到很多运输层协议。比如,TCP和UDP

      比较:

       网络层提供主机之间的逻辑通信。

       运输层为运行在不同主机上的进程提供逻辑通信。

      网络层协议中,有个事IP。其服务模型是尽力而为交付服务,不确保报文段的交付。是一种不可靠服务。

      将主机间交付扩展到进程间交付被称为多路复用和多路分解。

    TCP:提供可靠数据传输。通过使用流量控制、序号、确认和定时器,TCP确保正确的、按序的将数据从发送进程交付给接收进程。还有拥塞控制,可以控制传输速率。UDP流量是不可调节的。

    3.2 多路复用和多路分解

      多路复用:在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息,从而生成报文段,然后将报文段传递到网络层。

      多路分解:将运输层报文段中的数据交付到正确的套接字的工作。

      报文段有两个特殊字段:源端口号字段、目的端口字段。

      无连接的UDP:一个UDP套接字是由一个二元组全面标识的,包含一个目的IP地址和一个目的端口号。

      面向连接的TCP:TCP套接字是由一个四元组来标识的(源IP地址,源端口号,目的IP地址,目的端口号)。服务器主机支持很多并行的TCP套接字。现今的高性能web服务器通常只使用一个进程,但是为每个新的客户连接创建一个具有新连接套接字的新线程。

    3.3 UDP

      发送方和接收方的运输层实体之间没有握手,所以UDP是无连接的。DNS就是一个这样的应用。

     UDP选择的原因:控制更精细,关于发送什么数据和什么时候发送。无须建立连接。无连接状态。分组首部开销小。

      UDP报文段结构:源端口号,目的端口号,长度,校验和,应用数据。

    UDP检验和提供了差错检测功能,作为一种保险措施是非常有用的。虽然UDP提供差错检测,但它对差错恢复无能为力。

    3.4 可靠数据传输原理

     为上层实体提供的服务抽象是:数据可以通过一条可靠的信道进行传输。

     构造可靠数据传输协议有以下几种:

     1、经完全可靠信道的可靠数据传输:rdt1.0

     2、经具有比特差错信道的可靠数据传输:rdt2.0

     3、经具有比特差错的丢包信道的可靠数据传输:rdt3.0

     校验和、序号、定时器、肯定和否定确认分组,这些必不可少。

    ------------我是分割线-----------------------

    流水线可靠数据传输协议

    rdt3.0是一个停等协议,会限制底层网络硬件所提供的能力。流水线的方式,允许发送方发送多个分组而无须等待确认。这种方式的差错恢复有两种基本方法是:回退N步和选择重传。

    3.5 面向连接的TCP

     两个进程连接前,必须向“握手”,即它们必须相互发送某些预备报文段,以建立确保数据传输的参数。

     全双工服务。

     三次握手之后,就建立起了连接,然后开始发送数据。组成包括:两台主机上的缓存、变量与进程连接的套接字。

     流量控制服务,消除发送方使接收方溢出的可能性。TCP发送方也可能因为ip网络的拥塞而被遏制--拥塞控制。

     通过让发送方维护一个称为接收窗口的变量来提供流量控制。

     TCP连接管理

     连接和关闭图如下:

    这个过程就是常说的,三次握手,四次挥手。这个是重点,需要多看几次。

    TCP状态图,客户方面的:

    还有服务端的:

    拥塞控制方法:端到端拥塞控制,网络辅助的拥塞控制。TCP必须使用端到端拥塞控制而不是网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈。

  • 相关阅读:
    优化网站性能之数据库架构篇
    使用 P3P 规范让 IE 跨域接受第三方 cookie
    使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署
    将代码库从 SVN 迁移至 Git 并保留所有 commit 记录
    如何高效利用GitHub
    Mysql bin-log日志文件处理
    man手册页
    glibc/libc/blib区别
    列式数据库的简单分析
    Linux中如何设置服务自启动?
  • 原文地址:https://www.cnblogs.com/luoa/p/10993743.html
Copyright © 2011-2022 走看看