待补充完善

TCP 相关基本点

1、面向连接

两个不同主机上的进程在通过 TCP 进行通信之前,必须先通过三次握手来建立 TCP 连接

2、全双工服务

即,如果一台主机上的进程 A 与另一台主机上的进程 B 存在一条 TCP 连接,那么应用层数据就可以从进程 B 流向进程 A 的同时,也从进程 A 流向进程 B。

3、TCP 连接提供的是“点对点”的服务

即一对一的服务,不可能一对多、多对一或者多对多

什么是流量控制?为什么要进行流量控制?
后一个问题可以转化为:如果不进行流量控制,任其自然发展会怎么样
由于 TCP 是全双工的,所以一条 TCP 连接每一侧主机都为该连接设置了接收缓存。当该 TCP 连接接收到正确、按序的字节后,它就将数据放入接收缓存。相关联的应用进程会从该缓存中读取数据,但是不必数据刚一到达就立即读取。事实上,接收方应用也许正忙于其他任务,甚至要过很长时间后才去去读该数据。如果某应用程序读取数据时相对缓慢,而发送方送得太多、太快,发送的数据就会很容易地使该连接的接收缓存溢出。
由于现实中就是按这样运作的,所以如果不对发送方就行遏制,就会导致接收缓存溢出,从而导致数据丢失(或因数据丢失而造成的频繁重传)
而由于防止接收缓存溢出这个原因而遏制发送方的行为称为流量控制。
 
怎么进行流量控制,即,流量控制方法有哪些?
首先,当 TCP 连接建立起来之后,该连接的两方主机都会给该连接分配一个接收缓存(由于 TCP 是全双工的,所以每一方都会作为接收方),且都会维护一个接收窗口,该接收窗口的长度(当前没有被使用的长度)等于接收缓存的长度(总长度)减去已接收到但是还没有被应用进程读取的那部分数据的长度(正在被使用的长度)
每次发送数据给发送方时,都将接收窗口的长度捎带过去,发送方控制已发送但未确认的数据的长度不超过接收方接收窗口的长度,就做到了流量控制。
 
什么是拥塞控制?为什么要进行拥塞控制?
如果不进行拥塞控制,链路上的拥塞会逐步加重,直至链路瘫痪
为了防止链路过于拥塞,而遏制发送方发送速率的行为就是拥塞控制
 
怎么进行拥塞控制,即,拥塞控制方法有哪些?
拥塞控制方法有两种:
1、网络辅助的拥塞控制
在这种方法中,网络层构件(即路由器)会向发送方提供关于网络中拥塞状态的显式反馈信息,能够让发送方知道目前输出链路上支持的传输速率。
2、端到端拥塞控制
当网络层不提供显式支持(即不直接向发送方提供拥塞信息)时,端系统必须通过对网络行为的观察(比如分组丢失与时延)来推断拥塞情况。
 
流量控制与拥塞控制的区别?
流量控制和拥塞控制都是遏制发送方的发送速率
但是,这两类控制的目的不同
流量控制是为了防止接受缓存溢出,接收缓存溢出会导致数据丢失
拥塞控制是为了防止链路上的拥塞,当出现轻度拥塞时,如果不进行拥塞控制的话,拥塞程度很快会变成重度,然后一发不可收拾
 
TCP 的三次握手和四次挥手?
1、三次握手
如下图:

可参考我之前写的对于 TCP 三次握手的理解:

https://www.cnblogs.com/stone94/p/10185316.html

2、四次挥手
 如下图:

3、为什么连接的时候是三次握手,到了关闭的时候,是四次挥手?

因为对于连接建立来说,当发送方向接收方发送连接请求时,接收方能够立刻返回信息,并立即准备建立连接

而当接收方接到发送方的关闭连接时,只能说明发送方肯定不再需要发送数据了,但接收方说不定还需要发送一些数据给发送方,但是这些数据也许还在处理,不能立即返回

这时,接收方先返回一个 ACK 给发送方,表示你发过来的关闭连接的请求我收到了,但是我还有些其他数据要发给你,等我把这些数据发送完了,我会给你发一个关闭请求的。

于是当接收方发送完其他数据时,他给发送方发送了关闭请求,然后发送方回应他,最后连接彻底关闭

其实四次挥手的机制有点像异步回调
应用层和运输层都是在网络边缘(端系统中),而网络层和链路层都在网络核心

《计算机网络 自顶向下方法》 第3章 运输层 Part2的更多相关文章

  1. 计算机网络自顶向下方法第2章-应用层(application-layer).1

    2.1 应用层协议原理 2.1.1网络应用程序体系结构 1)在客户-服务器体系结构 (client-server architecture)中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为 ...

  2. 计算机网络自顶向下方法第3章-传输层 (Transport Layer).1

    3.1 概述和运输层服务 运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能. 3.1.1 运输层和网络层的关系 网络层提供了主机之间的逻辑通信,而 ...

  3. 计算机网络自顶向下方法第4章 网络层:数据平面 (Network layer)

    4.1 网络层概述  网络层主要功能为转发(将数据从路由器输入接口转移到合适的输出接口)和路由选择(端到端的路径选择),每台路由器都有一张转发表,用最长前缀匹配规则来转发. 4.1.1 转发和路由选择 ...

  4. 计算机网络自顶向下方法第2章-应用层(application-layer).2

    2.4 DNS:因特网的目录服务 2.4.1 DNS提供的服务 DNS的定义 实体层面看,DNS是一个由分层的DNS服务器实现的分布式数据库 协议层面看,DNS是一个使得主机能够查询分布式数据库的应用 ...

  5. 计算机网络自顶向下方法第3章-传输层 (Transport Layer).2

    3.5 面向连接的运输: TCP 3.5.1 TCP连接 TCP是因特网运输层的面向连接的可靠的运输协议. TCP连接提供全双工服务(full-duplex service). TCP连接是点对点的连 ...

  6. 《计算机网络 自顶向下方法》 第2章 应用层 Part1

    常见的应用层协议有哪些?  HTTP(HyperText Transfer  Protocol):超文本传输协议 FTP(File Transfer Protocol):文件传输协议 SMTP(Sim ...

  7. 《计算机网络 自顶向下方法》 第3章 运输层 Part1

    由于个人精力和智商有限,又喜欢想太多.钻牛角尖,导致学习系统性知识很痛苦,尝试改变学习方式,慢慢摸索 现在看到 rdt2.0,又有点看不下去 现在的想法: 要有个目标,且有截止时间(作业模式.考试模式 ...

  8. 《计算机网络 自顶向下方法》 第8章 计算机网络中的安全 Part2

    SSL(使 TCP 连接安全) SSL(Secure Socket Layer),即安全套接字层,是对 TCP 的强化 HTTPS 使用 SSL,而 HTTP 不使用 SSL 通过采用机密性.数据完整 ...

  9. 《计算机网络 自顶向下方法》 第6章 链路层和局域网 Part2

    待补充完善 Web 页面的请求历程 应用层     报文.主机 运输层     报文段. 网络层     数据报.路由器.IP 地址 链路层     以太网帧.交换机.MAC 地址 步骤 1)到 4) ...

随机推荐

  1. POJ1017&&UVA311 Packets(中文题面版)

    感谢有道翻译--- Description A工厂生产的产品是用相同高度h的方形包装,尺寸为1* 1,2 * 2,3 * 3,4 * 4,5 * 5,6 6.这些产品总是以与产品高度h相同,尺寸为66 ...

  2. java23种设计模式(二)抽象工厂模式

    我们接着上一章的工厂方法模式继续学习一下抽象工厂模式. 抽象工厂模式:在工厂模式中,如果有多个产品,则就是抽象工厂模式. 例子: 有一个工厂开了两个子公司,专门用来生产电脑配件键盘和鼠标,一个是联想工 ...

  3. 蓝牙TWS耳机IBRT的原理初分析

    最近在倒腾TWS对耳的一些东西,看到一些源码,发现一个新概念,IBRT没有搞清楚,抱着吾将上下而求索的态度,详细看了一些代码,查了一些资料,还是发现了不少有价值的信息的.至少,我突然感觉自己懂了一些什 ...

  4. session与cookie,django中间件

    0819自我总结 一.session与cookie 1.django设置session request.session['name'] = username request.session['age' ...

  5. VMware15.5版本下安装Windows_Server_2008_R2

    一.新建虚拟机 第一步:打开VMware15.5虚拟机,在欢迎界面点击新建虚拟机: 第二步:选择典型(推荐)选项-->适用于新手,单击下一步: 第三步:选定最后一项稍后安装操作系统,单击下一步: ...

  6. 支撑微博亿级社交平台,小白也能玩转Redis集群(实战篇)

    上篇文章<支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)>介绍了Redis集群相关原理,这篇文章将介绍Redis Cluster集群的搭建.配置,运维.扩容等具体操作 集群搭建 ...

  7. [Luogu3069][USACO13JAN]牛的阵容Cow Lineup

    题目描述 Farmer John's N cows (1 <= N <= 100,000) are lined up in a row. Each cow is identified by ...

  8. 无情的Java 8 之 Stream和lambda表达式篇

    不好意思,最近刷小视频刷的有点上头 看到这图就不自觉的要来一句:"卧槽,无情" 好了,我要开始正经了 JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样 ...

  9. WebShell代码分析溯源(一)

    WebShell代码分析溯源(一) 一.一句话变形马样本 <?php $_GET['POST']($_POST['GET']);?> 二.代码分析 1.调整代码格式 <?php $_ ...

  10. 使用Redis在Hibernate中进行缓存

    Hibernate是Java编程语言的开放源代码,对象/关系映射框架.Hibernate的目标是帮助开发人员摆脱许多繁琐的手动数据处理任务.Hibernate能够在Java类和数据库表之间以及Java ...