15分钟TCP

TCP协议详解

介绍TCP协议之前,先区分一下TCP协议,和TCP/IP体系结构。TCP协议是TCP/IP协议体系中运输层的协议之一,提供可靠的运输层服务,具有面向连接,面向字节流,提供可靠交付,据用流量控制和拥塞控制等特点。

先简单介绍一下TCP/IP体系结构, 以便于清晰一下自己所在协议栈的位置。

OSI七层太过复杂,且没有在开始的时候快速占领市场。当时一直到现在使用的都是TCP/IP体系结构,但是为了更好的阐述基本原理,还是按照五层体系结构来划分说明。

image.png

TCP/IP协议族

image.png

传输控制协议TCP

概述

协议特点:

  • 面向连接的协议:建立连接、关闭连接
  • 点对点:连接只能有2个端点
  • 可靠交付:无差错、不丢失、不重传、按顺序交付给应用层
  • 全双工:通信双方在任何时候都能够发送数据
  • 面向字节流:每个字节都有序号,比如说累积确认,确认号就是下一个字节编号

报文剖析

image.png

下面对部分首部字段详细说明:

  • 序号:是报文段数据部分的字节的序号。在首部中占4个字节,2的32次幂个序号。超过后,回到0。之所以说TCP面向字节流,是因为每个字节都有一个序号。如序号是301,数据共100字节,那么最后一个字节的序号是400。所以下一个报文段的序号从401开始。
  • 确认号:是作为接受方的一端在收到tcp报文后,期望下一次收到的字节的序号,继续上文序号的例子,收到301,数据长度100,那么再ack这个报文的时候,确认号应该是401(301+100)

这里有个重要的概念——累积确认,就是说,如果:

确认号=N,表明,到序号N-1为止的所有数据都已经正确收到!
  • 数据偏移:数据部分距离首部有多远(因为tcp报文段中包含可变长度的选项,不能根据位数定位数据部分)

  • 控制位URG

  • 控制位ACK:ACK=1时候,确认号字段才有意义,说明该报文包含确认

  • 控制位PSH:为1时,表明接收方收到报文后要尽快交付给应用层

  • 控制位RST:Reset复位,连接出现严重差错,必须释放连接然后再重建连接

  • 控制位SYN:建立连接的时候使用,用来同步报文起始序号

  • 控制位FIN:finish,释放连接的时候使用

  • 窗口:占2字节,表明作为接收方,我还有多少字节的缓冲空间来接受新的字节,数据的单位是字节,该值作为发送方设置其发送窗口大小的依据

可靠传输

滑动窗口动态视频-Normal
滑动窗口动态视频-Error

image.png

右边的图反转一下更容易理解。

流量控制

接收方来不及接收,会造成数据丢失。所谓流量控制就是让发送发不要发送的太快。

主要利用滑动窗口来控制。

这里有个知识点,就是当接收窗口为0之后,如何打破死锁局面。打破的方法就是发送端发送零窗口探测报文(似乎也是keep alive报文),接收方在确认这个报文的时候,将新的窗口值带上,如果不是0,死锁就打破了。

拥塞控制

  • 慢开始
  • 拥塞避免
  • 快速重传
  • 快速恢复

连接管理

三次握手建立连接,四次交互关闭连接。连接的状态变化。

建立连接

经过下图的三次握手之后,连接被成功建立。

image.png
  1. 客户机A请求服务器B打开连接,进入SYN-SENT状态
  2. 服务器B响应“打开连接的请求”,进入SYN-RCVD状态
  3. 客户机A收到SYN-SEND的ack, 进入ESTABLISHED状态,并再一次确认B的响应,这次可以携带数据也可以不携带数据,SYN=1, ACK=1, seq=x+1, ack=y+1, 机器B在收到此确认后,进入ESTABLISHED状态

这期间server或会设定MSS等参数

释放连接

image.png
  1. 机器A请求关闭连接,发送终止信号,进入FIN-WAIT阶段一(终止等待1),等待机器B的确认
  2. B收到A的终止信号,随即发送确认,并通知上层进程,进入CLOSE-WAIT,关闭等待状态;这时候从A到B这个方向的连接释放了,TCP连接的状态为办关闭状态。A已经没有数据要发送了,但是B可能还有数据要发送,并可以继续发送;
  3. 当A收到B对终止信号的确认,A进入终止等待2,等待B最终的确认;当B没有数据发送的时候,B会再次确认A的终止信号(意在关闭B到A方向上的连接),B进入LAST-ACK状态
  4. A收到B对终止信号的第二次确认后,A发送对确认的确认,进入TIME-WAIT状态;当B收到确认后,关闭连接回收资源;当2MSL之后,A也关闭连接,释放资源
MSL: max segment lifetime, 最大报文寿命
MSS: max segment size  最大报文长度
TIME-WAIT阶段等待2MSL的作用:
1. 如果B没有收到最后的ACK, B会重传FIN=1, 当A收到这个重传的FIN=1, 最大时间刚好是2MSL(A发送最后的ACK时间 + B重传FIN=1的时间)当A收到B的FIN=1时候,再次发送最后的ACK,同事2MSL计时器重新启动
2.可能这时候还有很多从B发过来的报文(因为拥堵,或排队超时,被重传的那些报文)还在来的路上,但是这些报文已经无效了,为了防止A机器上新的连接收到这些报文,需要等这次报文超时。 

TCP有限状态机

image.png
  • 粗实线对应主动打开连接一方的状态变化
  • 虚线对应被动打开连接一方的状态变化
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容