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. 应用笔画宽度变换(SWT)来检测自然场景中的文本

    Introduction: 应用背景:是盲人辅助系统,城市环境中的机器导航等计算机视觉系统应用的重要一步.获取文本能够为许多视觉任务提供上下文的线索,并且,图像检索算法的性能很大部分都依赖于对应的文本 ...

  2. Unity 补充安装

    当需要下载 安装Unity之时没勾选的一些组件时, 1.去Unity官网点开Unity旧版本 2.找到你的Unity版本,然后只要下载Unity安装程序 3.点开安装程序,去掉已安装组件的勾选,勾选你 ...

  3. word使用

    1:插入图片,显示不完整,需要>点击上方的段落,选择单倍行距 2:wps  可以直接右键选择保存文件中的图片 3:word中换行符的标识符为^p ,可以用来替换换行符. 4:使word中某一段背 ...

  4. 图结构练习——判断给定图是否存在合法拓扑序列(sdutoj)

    #include<stdio.h>#include<string.h>int d[15],map[15][15],vis[15];int main(){    int i,j, ...

  5. M2Eclipse:Maven Eclipse插件无法搜索远程库的解决方法

    使用Eclipse安装了maven插件之后,创建Maven工程,发现添加依赖“Add Dependency”的时候无法自动搜索远程库. 如果不能搜索远程库那用这个插件有啥用撒... 查遍了所有的mav ...

  6. data.frame和matrix的一些操作

    编写脚本的时候经常会涉及到对data.frame或matrix类型数据的操作,比如取指定列.取指定行.排除指定列或行.根据条件取满足条件的列或行等.在R中,这些操作都是可以通过简单的一条语句就能够实现 ...

  7. [LeetCode] 589. N-ary Tree Preorder Traversal_Easy

    Given an n-ary tree, return the preorder traversal of its nodes' values. For example, given a 3-ary  ...

  8. VMware Coding Challenge: The Heist

    类似BackpackII问题 static int maximize_loot(int[] gold, int[] silver) { int[][] res = new int[gold.lengt ...

  9. Summary: Java中函数参数的传递

    函数调用参数传递类型(java)的用法介绍. java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class Te ...

  10. Linux基础命令---paste

    paste 将指定的文件按照列的方式合并,将结果显示到标准输出设备上,相当于两个并列的cat命令. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.F ...