Transport Layer

在学习完 Link Layer(Ethernet),Internetwork Layer(IP)之后,我们来到了TCP/IP协议簇的上半部分。

Review:Magic of IP

它做了啥?想办法把数据报从一个网络 通过 5 - 20 个路由器 转递到另外一个网络。

保持对网络中 畅通 或者 堵塞的路径 的跟踪,如果有可能的话想办法选择更好的路径。

但是不能保证 数据能到达目的地,如果转递过程中出现了差错,数据报会被丢弃。

这使得 它非常快速,和可伸缩性(scalable),最终 “具有可靠性”,因为它并没有把所有的事情都做了。

Internet Protocol

很多连接,节点。

很多路由。

Thinks can change dynamically(动态地),and the IP has to react(link up/down).

IP 有可能会扔掉 packet。

TCP:Transport protocol

  • Build on top of IP.
  • Assume IP might lose data.
  • In case data gets lost, we keep a copy of the data. We send until we get an acknowledgement.
  • If it takes "too long", just send it again.

TCP 弥补了在IP层中可能的错误,同时也使用了可用的资源。

底层的网络 有多快?(快的话,目的是节省时间,慢的话,目的是为了提高效率)它很可靠吗?如果底层的网络数据传输出现了错误,怎么办?这就是TCP考虑的问题。

所以 TCP协议 的核心是 如果我们发送了一些数据报,我们把它分片成一些 分组,然后我们一片片的发送它们,如果发送端收到了目的端的ACK(acknowledgement),就可以准备发送下一个数据了。与此同时,如果某些数据报片丢失了,发送端会重新发送数据报,直到收到目的端的ACK为止。

所以这就是 TCP 所做的最基本的工作。

这里有一个例子:

一个数据报被分成五片,大小分别是:100,200,300,400,500字节。首先 我们发送 100,200,300字节的三片数据,100,300到达目的地,200在途中销毁。过了一段时间,接收端发送ACK 告诉 发送端:

嘿,老哥,我收到了你发送的两片数据了,他们是 100 和 300,但是我还没有收到200的,能不能给我发送一下?

当然,发送端就“猜到”200的数据报片在转递过程中被遗失了,由于接收端已经收到了100,那么发送端丢弃了100的数据报片,从200开始重新发送。

第二次,发送端 发送200 和 300的数据报片,接收端发送ACK确认收到了。于是发送端继续发送 400,500 的数据报片,并且丢弃 200 和 300 的数据报片。dotdotdot···

所以,这有点像在 TCP的接收端和发送端 记账一样。

设计IP层的时候,我们要求它很快速,很灵活,但是我们同时也给予了它丢弃数据报的权力,我们并没有要求IP层进行存储的工作。

但是,很明显,在网络中有很多的路由器,连接上网络的PC却是以亿计数的。我们需要让数据的传输具有可靠性,所以在PC上我们需要有足够的内存来存储这些数据以防万一:在必要的时候重新发送数据报。

当我们连接一台计算机到网络上的时候,我们就在这台计算机上配置了内存来存储发送的数据,所以当计算机在发送数据的时候,它负责对发送的数据报进行复制并且保留复制品。它并不期望网络来做这个事情。

这非常的 absolutely brilliant,这个机制给互联网带来了无穷的好处。

当然了,在成功的背后,同样有许多的工程师为这个机制做出了贡献。

在1980年,很多人预言,Internet即将消亡,当时的学术界的技术不足以支撑Internet的发展。越来越多的计算机连接到网络中,导致网络越来越慢,逐渐有“crash”的倾向。

工程师 Van Jacobson 拯救了“世界”,发明了TCP协议。

Van Jacobson - Slow Start Algorithm

Van Jacobson:Packet Design,PARC首席工程师。

网络通过在不同的大学聚集的方式 逐渐地扩大。NFS 用56kb的电缆 把这些校园网络连接到了一起,形成了NSFNET 一期。这在当时很受欢迎,人们可以通过网络交流,发电子邮件等等。但是每一个校园都会让当时的网络超负载,丢失了很多分组。

当时 Van 在 Lawrence Berkerly 实验室做 high-energy 的物理实验,同时也在 Berkerly 校园教书,在上个世纪八十年代,每一门课都有一个信息群,任何作业都会被发送到网络上,Van 通过网络下载下来课程的资料,但是当时的网络非常缓慢,吞吐量为0,大概十分钟一个分组,这就很糟糕了。于是 Van 就和 Mike Karels 一起商讨,Mike 当时也领导了开发 Berkerly Unix 的BSD团队,他也被这个问题所困扰。

那个时候,运行TCP/IP最简单的方法就是,启动 Berkerly Unix,在 Unix 上有一个程序,但是性能实在是有点糟糕。这个小程序在运行小规模的测试的时候崩溃了,Van 和 Mike 花了很长的一段时间来找错误,尝试找出原因。他们的关注点就来到了 协议是如何处理这些带宽的变化,如何处理多个跳数。

接收端发送的 ACK 就像时钟一样,提醒 发送端 什么时候是安全的时刻来发送一个新分组。

TCP 运行的时候是相当完美的,但是困难的地方就在于 启动的时候,如果你突然启动,很容易造成某个网关的缓存饱和,当你重新发送的时候,又重新做了一遍这种我们不想看到的事情,所以总是会丢失分组。但是如果你逐渐的启动,就会得到一个时钟(ACK)来控制 TCP数据报输出队列,以便控制缓存,防止缓存过载。

那么是如何把这种机制 引入进全球的 TCP/IP 系统中呢?

Van 非常的机智,开发组里的内核黑客们开发了一个内核的程序,通过这个程序可以获取数据报,并导致内核错误。他们把这个程序通过全球用户的邮件列表(当时规模不大)用邮件发送到了网络上,许多用户来下载这个东西,并提供错误的反馈,Van 于是 发布了很多次新的版本,修改了这一错误,并且也潜移默化的把这个机制植入了用户的系统中。

2016/8/4

【Coursera】Sixth Week(1)的更多相关文章

  1. 【Coursera】Sixth Week(2)

    DNS:Domain Name System The Domain Name System convert user-friendly names,like www.umich.edu, to net ...

  2. 【Coursera】Security Introduction -Ninth Week(2)

    对于公钥系统,我们现在已经有了保证它 Confidentially 的一种方法:SSL.SSL利用了公钥的概念. 那么 who we are talking to? Integrity Certifi ...

  3. 【Coursera】Security Introduction -Ninth Week(1)

    前言 Coursera 的 Internet History,Technology,and Security 进入最后一周的学习了,在这最后一周内,需要进行的内容是 public-key 公钥系统的讲 ...

  4. 【Coursera】Security Introduction -Eighth Week(2)

    Review -Terminology(术语): Confidentiallity & Integrity 泄密 & 欺骗 Confidentiallity: Prevent unau ...

  5. 【Coursera】History: Dawn of Electronic Computing学后小结

    今天学习了Coursera上University of Michigan开的互联网的历史.技术和安全课程的FirstWeek内容. 先是吐槽下这个Coursera,认证非常麻烦,PC端需要摄像头拍照. ...

  6. 【Coursera】支持向量机

    一.最大间隔分类器 1. 函数间隔:\(γ^{i} = y^{i}(w^{T} x + b)\), 改变w和b的量级,对分类结果不会产生任何影响,但是会改变函数间隔的大小.因此,直接对函数间隔求最大值 ...

  7. 【Coursera】Internet History 读书笔记

    前言 这个Internet History 有些令人劝退.电脑无法播放视频.手机不能播放.最后百度了改了hosts文件才可以. 附上解决方法: 解决coursera可以登录但无法播放视频 第一周 第三 ...

  8. 【Alpha】——Sixth Scrum Meeting

    一.今日站立式会议照片 二.每个人的工作 成员 昨天已完成的工作 今天计划完成的工作 李永豪 对统计出现的问题进一步完善 学习将项目做成APK 郑靖涛 完善报表设计 协助设计账目一览表板块 杨海亮 测 ...

  9. 【Coursera】Security Introduction -Summary

    对这门课程的安全部分进行一个小结. 往期随笔 第八周第一节 第八周第二节 第九周第一节 第九周第二节 前言:为什么互联网要提及安全 因为security牵扯到我们每一个人,有人每时每刻都想着要偷取别人 ...

随机推荐

  1. 为帝国cms模板添加站内搜索小教程

    由于客户的需要,最近都在整帝国cms,很多东西还是不熟悉,特别是帝国cms模板,以前用的那些网站模板一般是保存在ftp文件中,而帝国cms模板是直接保存在数据库中,修改是在网站后台的模板管理,得慢慢适 ...

  2. C#基础笔记(第十天)

    C#基础笔记(第十天) 1.字段.属性.方法.构造函数字段:存储数据属性:保护字段,对字段的取值和设值进行限定方法:描述对象的行为构造函数:初始化对象(给对象的每个属性依次的赋值)类中成员,如果不加访 ...

  3. requesMapping注解

    java类 package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; impor ...

  4. win 7 和 winserver 2008 下,布署网站遇到的错误解决方法

    本人亲测,有效. 1.如果只列出目录: web.config的system.webServer配置节下是否有这个: <modules runAllManagedModulesForAllRequ ...

  5. rabbitmq_坑

      一.None of the specified endpoints were reachable 这个异常在创建连接时抛出(CreateConnection()),原因一般是ConnectionF ...

  6. 3:3 OGNL 表达式一

    一: 用例 (直接链式访问属性名,其实内部还是的调用set,get方法实现数据的流动); 二: 注意:表达式里面是没有方法的,只能点属性, 访问列表: (访问的时候加上#,表示访问非值栈的内容.) 访 ...

  7. Spring整合ActiveMQ:spring+JMS+ActiveMQ+Tomcat

    一.目录结构 相关jar包 二.关键配置activmq.xml <?xml version="1.0" encoding="UTF-8"?> < ...

  8. python 有道翻译

    import requests import time import random import hashlib i = str(int(time.time()*1000)+random.randin ...

  9. presto 0.166概述

    presto是什么 是Facebook开源的,完全基于内存的并⾏计算,分布式SQL交互式查询引擎 是一种Massively parallel processing (MPP)架构,多个节点管道式执⾏ ...

  10. LINUX环境变量(二)

    一.Shell变量分为本地变量和环境变量. 1.本地变量:在用户现有运行的脚本中使用 a) 定义本地变量 格式: variable-name=value b) 显示本地变量 格式: set  c) 清 ...