TCP 协议

本贴最后更新于 2408 天前,其中的信息可能已经东海扬尘

TCP:可靠传输、按序到达。

一、TCP 报文段格式
源端口号(2byte)、目的端口号(2byte)
序列号(4byte)
ACKnum(4byte)
Offset(4bit)、Reserved(4bit)、TCP Flags(1byte)、Window(2byte)
Checksum(2byte)、...
...

二、三次握手

  1. 客户端向服务器发送连接建立请求报文段(Segement)(SYN=1,seq=x)(调用了 connect()方法),发送之后客户端进入 SYN_SEND 状态;
  2. 服务器收到客户端的请求报文段,向客户端发送一个 ACK 和连接建立请求结合在一起的报文段(ACK=1,ACKnum=x+1,SYN=1,seq=y),并从 LISTEN 状态(调用了 listen()方法)进入 SYN_RCVD 状态;
  3. 客户端收到 ACK 报文段后,向服务器发送一个 ACK 报文段(ACK=1,ACKnum=y+1),并进入 ESTABLISHED 状态;
  4. 服务器收到 ACK 报文段,也进入 ESTABLISHED 状态。
    至此,客户端和服务器的连接建立,之后就可以调用 read()和 write()方法进行读写操作了。

三、四次挥手

  1. 客户端向服务器发送连接关闭请求报文段(FIN=1,seq=x)(调用了 close()方法),发送之后客户端进入 FIN_WAIT_1 状态;
  2. 服务器收到客户端的请求报文段,向客户端发送 ACK 报文段(ACK=1,ACKnum=x+1),并进入 CLOSE_WAIT 状态;
  3. 客户端收到服务器的 ACK 报文段后进入 FIN_WAIT_2 状态;
  4. 服务器向客户端发送连接关闭请求报文段(FIN=1,seq=y)(调用了 close()方法),发送之后服务器进入 LAST_ACK 状态;
  5. 客户端收到服务器的请求报文段,向服务器发送 ACK 报文段(ACK=1,ACKnum=y+1),并进入 TIME_WAIT 状态;
  6. 服务器收到客户端的 ACK 报文段,进入 CLOSE 状态;
  7. 客户端等待 2MSL,期间没有收到服务端的连接关闭请求博爱文段,则进入 CLOSE 状态。
    至此,客户端与服务器的连接关闭。

MSL(Maxinum Segment Live)
TCP 报文在网络传输时最长生存时间。

客户端为什么要等待 2MSL
因为 ACK 报文段可能在网络传输的过程中丢失。如果发送了这种情况,那么服务器在等待 2MSL 时间后会重新一个连接关闭请求报文段,客户端在等待的这 2MSL 时间内正好可以收到这个请求报文段,于是重发 ACK 报文段,再等待 2MSL,重复这个过程直到在等待的 2MSL 时间内没有收到请求报文段,进入 CLOSE 状态。

SYN Flood 攻击
描述:给服务器发了一个 SYN 后,就下线了,于是服务器需要默认等 63s 才会断开连接,这样,攻击者就可以把服务器的 syn 连接的队列耗尽,让正常的连接请求不能处理。
解决方法:Linux 下给了一个叫 tcp_syncookies 的参数来应对这个事——当 SYN 队列满了后,TCP 会通过源地址端口、目标地址端口和时间戳打造出一个特别的 Sequence Number 发回去(又叫 cookie),如果是攻击者则不会有响应,如果是正常连接,则会把这个 SYN Cookie 发回来,然后服务端可以通过 cookie 建连接(即使你不在 SYN 队列中)。

三、确认机制
一种是确认收到的最大的连续收到的包。
一种是收到一个包去人一个包。

四、超时重传机制
一种是重传超时的包及其之后的包(因为接收端只确认了最大的连续收到的包),快,但浪费带宽。
一种是仅重传超时的包,慢,但节省带宽。

往返时间(RTT,Round Trip Time)
通过 RTT+ 算法(好几种)算出超时重传时间(RTO,Retransmission TimeOut)。

五、滑动窗口协议
window:还有多少缓冲区可以用。

发送端
LastByteAcked、LastByteSent、LastByteWriter
SendWindow、UsableWindow

接收器
LastByteRead、NextByteExpected、LastByteRcvd
...、ReceiveWindow
window=MaxRcvBuffer - LastByteRcvd – 1

六、拥塞控制
慢启动阈值(ssthresh,slow start threshold)

拥塞控制算法:
Tahoe:没有快速恢复阶段;
Reno:增加了快速恢复阶段。

1. 慢启动
拥塞窗口(cwnd,Congestion Window)。
①. 连接建立后初始化 cwnd=1;
②. 每当收到一个 ACK,cwnd++,呈线性上升;
③. 每过一个 RTT,cwnd*=2,呈指数上升;
④. 当 cwnd>=慢启动阈值时,将 cwnd 减半,进入拥塞避免算法;

2. 拥塞避免
①. 每收到一个 ACK,cwnd = cwnd + 1/cwnd;
②. 每过一个 RTT,cwnd += 1;

3. 快速重传
收到 3 个重复 ACK 就重传包,然后 cwnd = cwnd /2,ssthresh = cwnd, 进入快速恢复阶段。
(以前是等到超过超时重传时间 RTO 再重传包,然后 ssthresh = cwnd /2,cwnd 置为 1,重新进入慢启动。)

4. 快速恢复
快速恢复阶段认为,还有 3 个重复 ACK 说明网络并不那么糟糕,所以
①. cwnd = ssthresh + 3*MSS;
②. 重传重复 ACK 指定的包;
③. 如果再收到重复 ACK,直接 cwnd += 1;
④. 如果收到新的 ACK,那么 cwnd = ssthresh,然后进入拥塞避免算法。

这个快速恢复算法存在的问题就是它依赖于 3 个重复的 ACK。 注意,3 个重复的 ACK 并不代表只丢了一个数据包,很有可能是丢了好多包。但这个算法只会重传一个,而剩下的那些包只能等到 RTO 超时,于是,进入了恶 梦模式——超时一个窗口就减半一下,多个超时会超成 TCP 的传输速度呈级数下降,而且也不会触发快速恢复算法了。

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 733 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖 • 2 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 191 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 429 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 476 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1458 回帖 • 118 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 610 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 4 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 519 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 437 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 10 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 58 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 12 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 561 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 25 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 181 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 152 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    109 引用 • 54 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 703 关注