TCP

三次握手过程

用"三次握手"建立TCP连接
  • 第一步:客户机的TCP首先向服务器的 TCP 发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的 SYN 标志位被置为1.另外,客户机会随机选择一个起始序号 seq=x (连接请求报文不携带数据,但要消耗掉一个序号)。然后客户端进入 SYN-SENT 状态,等待服务器的确认
  • 第二步:服务器的 TCP 收到连接请求报文后,如同意建立连接,就向客户机发回确认,并为该 TCP 连接分配 TCP 缓存和变量。在确认报文段中,SYN 和 ACK 位都被置为 1 ,确认号字段的值为 x+1,并且服务器随机产生起始序号 seq=y (确认报文不携带数据,但也要消耗掉一个序号)。确认报文段同样不包含应用层数据。
  • 第三步:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的 ACK 标志为被置 1,序号字段为 x+1,确认号字段 ack=y+1。该报文段可以携带数据,如果不携带数据则不消耗序号
为什么 "三次握手" 而不是 "两次握手" 建立连接:
TCP 三次握手缺陷
  • 服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的。这就使得服务器易受到 SYN 洪泛攻击
  • SYN 洪泛攻击: 通过向网络服务所在端口发送大量的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问。
  • 防范:
    1、降低SYN timeout时间,使得主机尽快释放半连接的占用
    2、采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文。
    3、此外合理地采用防火墙等外部网络安全设施也可缓解SYN泛洪攻击。

四次挥手过程

用 "四次握手" 释放TCP连接
  • 第一步:客户端打算关闭连接,就向其 TCP 发送一个连接释放报文段,并停止再发送数据,主动关闭 TCP 连接,该报文的 FIN 标志位被置为 1,seq=x,它等于前面已传送过的数据的最够一个字节的序号加 1 (FIN 报文段即使不携带数据,也要消耗掉一个序号)。TCP 是全双工的,即可以想象成是一条 TCP 连接上的两条数据通路。当发送 FIN 报文时,发送 FIN 的一端就不能再发送数据,也就是关闭了其中一条数据通路,但对方还可以发送数据
  • 第二步:服务器收到连接释放报文段后即发出确认,确认号是 ack=u+1,而这个报文段自己的序号是 v,等于它前面已传送过的数据的最后一个字节的序号加 1。此时,从客户机到服务器这个方向的连接就释放了,TCP 连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭
  • 第三步:若服务器已经没有要向客户机发送的数据,就通知 TCP 释放连接,此时其发出 FIN=1 的连接释放报文段
  • 第四步:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,ACK 字段被置为 1,确认号 ack=w+1,序号 seq=u+1。此时 TCP 连接还没有释放掉,必须等待时间计时器设置的时间 2MSL 后,A 才进入到连接关闭状态
time-wait 状态,最后一次握手报文后要等待 2MSL(最长报文段寿命) 的时间呢? 参考
  • 第一、为了保证 A 发送的最后一个确认报文段能够到达 B 。如果 A 不等待 2MSL,若 A 返回的最后确认报文段丢失,则 B 不能进入正常关闭状态,而 A 此时已经关闭,也不可能再重传。
  • 第二、A 在发送完最后一个确认报文段后,再经过 2MSL 可保证本连接持续的时间内所产生的所有报文段从网络中消失。假设没有time-wait 限制,因某些原因我们先关闭这条TCP连接,然后很快又以相同的<源ip,源port,目的ip,目的port> 建立一个新的TCP连接,然后发送数据,设想此时前一个连接在网络中滞留的数据报现在到达接收方,会被当做正常数据接收并上传到应用层,而这些旧数据不应该被接收。从而引起数据错乱而导致各种无法预知诡异错误
time-wait 状态如何避免
  • 首先服务器可以设置 SO_REUSEADDR 套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。

TCP 知识框架图

  • 特点:有连接、一对一、提供可靠交付、全双工通信、面向字节流
  • 首部:20B,源端口、目的端口、序号、确认号等控制信息
  • 连接管理:三次握手建立、四次握手释放
  • 可靠传输机制
    1、 序号:用来保证数据能有序提交给应用层
    2、 确认:确认号为期待收到的下一个报文段第一个字节的序号
    3、 重传:1、超时:计时器到期还没收到确认则重传对应报文。2、冗余确认:当收到失序报文时向发送端发送冗余 ACK。例如发送方A发送了序号1、2、3、4、5的TCP报文段,其中2号报文丢失,3、4、5对于B来说就是失序报文,当3、4、5到达B就发送3个对1号报文段的冗余ACK,表明自己期望得到2号报文段,这时A收到三个冗余ACK,立即对2号报文重传
  • 流量控制:在确认报文中设置接收窗口 rwnd(接收窗口) 的值来限制发送速率
    在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这就是接收窗口 rwnd
    流量控制是为了控制发送方发送速率,保证接收方来得及接收。
    接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
    流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
  • 拥塞控制
    • 原理:发送方根据自己估算的网络拥塞程度设置 cwnd(拥塞窗口) 的值来限制发送速率
    • 方法:
      1、慢开始:当 cwnd < ssthresh 时,每收到一个报文段的确认 cwnd 加1
      2、拥塞避免:当 cwnd > ssthresh 时,每经过一个往返时延 cwnd 加 1
      3、快重传:当收到连续的三个重复的 ACK,直接重传对方期待的报文
      4、快恢复: 当收到连续的三个冗余 ACK,令 ssthresh = cwnd = cwnd/2
    • 拥塞处理:ssthresh 置为原 cwnd 的一半,cwnd 置 1
  • 开环控制 就是在设计网络时事先将有关拥塞发生的所有因素考虑周到,一旦系统运行起来就不能在中途改正。
  • 闭环控制 是基于反馈环路的概念,包括如下措施:
    1)监测网路系统以便检测拥塞在何时何地发生
    2)把拥塞发生的信息传送到可采取行动的地方
    3)调整网络系统的行动以解决出现的问题。

参考

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

推荐阅读更多精彩内容