Netty理论四:TCP vs UDP

1、 区别

  • TCP数据结构复杂,UDP 数据结构较简单
  • TCP 是面向连接的,UDP 是面向无连接的
  • TCP 是面向字节流的,UDP 是基于报文的
  • TCP 保证数据顺序性,UDP 不保证
  • TCP 保证数据准确性,UDP 可能丢包,即TCP是可靠传输

2、数据结构

  • TCP:
    image.png
  • UDP:
    image.png

从数据结构上可以看出来,TCP比UDP要复杂的多。

3、TCP建立连接和断开连接

我们上面说tcp是面向连接的,这是啥意思呢,简单的说,tcp要发送数据,首先得先建立连接,而udp不需要,直接发送数据就行了。

TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息。
而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时,为半双工。

三次握手建立连接过程
  • 第一次握手:客户端通过向服务端 发送一个含有同步序列号seq和SYN标志位的请求报文给服务端,向服务端 请求建立连接,通过这个报文, 客户端告诉服务端 两件事:我想要和你通信SYN=1;本次TCP通信的字节流的初始序号SEQ=x。——请求发送后,客户端便进入SYN-SENT状态。

  • 第二次握手:服务端 收到 客户端的请求后,用一个带有确认应答(ACK)和同步序列号(seq)标志位的数据段响应客户端,也告诉客户端两件事:我已经收到你的请求了,你可以传输数据了ack=1;本次TCP通信的发送字节流的初始序号SEQ=y——该应答发送完成后,服务端便进入SYN-RCVD状态

  • 第三次握手:客户端收到这个数据段后,再发送一个确认应答,确认已收到服务端的数据段,表示服务端发来的连接同意应答已经成功收到。
    客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

为什么采用三次握手?而不是二次?
是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误;比如有以下场景,当客户端发出第一个
连接请求1并没有丢失,而是在某些网络节点长时间滞留了,这时客户端会认为超时,会再次发送连接请求2,服务端在接收到连接请求2以后建立了正常的连接,这时候失效请求1又到达了服务端,服务端会误以为是客户端又发出的一个连接请求,于是会再次建立连接,假定不采用三次握手,那服务端发出确认,新的连接就建立了。但是由于客户端并没有发出新的建立连接的请求,因此客户端不会再新的连接上发送数据,而服务端却以为新的连接已经建立了,在一直等待客户端的数据,由此会导致服务端许多资源的浪费。采用了三次握手后,可以防止这个现象发生,在客户端收到服务端对于自己的无效连接的应答后,并不会向服务端发出确认,服务端由于收不到确认,就可以认为此次连接是无效的。

四次握手断开连接过程
  • 第一次握手: 当客户端完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求 ;此时,客户端将进入FIN-WAIT-1状态

  • 第二次握手: 服务端收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1;此时B进入CLOSE-WAIT状态,A收到该应答,进入FIN-WAIT-2状态

第二次挥手完成后,客户端到服务端的连接已经释放,B不会再接收数据,A也不会再发送数据。这个时候只是客户端不再发送数据,但是 B 可能还有未发送完的数据,所以需要等待服务端也主动关闭。

  • 第三次握手: 服务端再提出反方向的关闭请求,服务端进入LAST-ACK状态

  • 第四次握手: 客户端对服务端的请求进行应答,双方向的关闭结束。客户端进入TIME-WAIT状态,该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态;当服务端收到确认应答后,也便进入CLOSED状态

为什么是四次?
关闭连接时,当Server收到FIN报文时,很可能并不会立即关闭socket,因为Server端可能还有消息未发出,所有其只能先回复一个ACK报文,告诉Client端,你的关闭请求我收到了;当Server把所有的报文都发送完以后,Server才能给Client端发送FIN报文关闭连接,Client收到后应答ASK。所以需要四次握手

在四次握手后,Server端先进入TIME_WAIT状态,然后过2MS(最大报文生存时间)才能进入CLOSE状态。为啥?
因为网络是不可靠的,客户端在第四次握手的ACK可能会丢失,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文

image.png

4、TCP 如何保证数据顺序性

TCP是顺序性,是通过协议中的序号来保证,每个包都有一个序号ID,
在建立连接的时候会商定起始 序号ID 是什么,然后按照 序号ID 一个个发送。

5、TCP 如何实现可靠传输?

tcp是通过应答/确认/ACK 以及 重传机制来保证消息可靠传输的。

确认机制

即在消息包发送后,要进行确认,当然,这个确认不是一个一个来的,而是会确认某个之前的 ID,表示都收到了,这种模式成为累计应答或累计确认。
确认是通过报文头里面的确认序号来保证的。

为了记录所有发送的包和接收的包,TCP 需要在发送端和接收端分别来缓存这些记录,发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分

  • 发送并且确认的
  • 发送尚未确认的
  • 没有发送等待发送的
  • 没有发送并且暂时不会发送的

所以,发送端要保持下面的数据结构
image.png
重传机制
  • 超时重传:发送端对每一个发送了但是没有 ACK 的包设定一个定时器,超过了一定的时间就重新尝试。这个时间必须大于往返时间,但也不宜过长,否则超时时间变长,访问就变慢了。
    如果一个消息包多次超时呢?每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。

  • 快速重传:超时重传的缺点是超时周期可能相对较长,所以还有一个快速重传的机制。即当接收方接收到一个序号大于期望的报文段时,就检测到了数据流之间的间隔,于是发送三个冗余的 ACK,客户端接收到之后,知道数据报丢失,于是重传丢失的报文段。

    例如,接收方发现 6、8、9 都接收了,但是 7 没来,所以肯定丢了,于是发送三个 6 的 ACK,要求下一个是 7。客户端接收到三个 6 的 ACK,就会发现 7 的确丢了,不等超时,马上重发。

6、TCP 流量控制 和 拥塞控制

流量控制

流量控制指的是发送端不能无限的往接收端发送数据(UDP就可以),为啥呢?

因为在 TCP 里,接收端在发送 ACK 的时候会带上接收端缓冲区的窗口大小,叫 Advertised window,超过这个窗口,接收端就接收不过来了,发送端就不能发送数据了。这个窗口大概等于上面的第二部分加上第三部分,即 发送未确认 + 未发送可发送。

流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。

tcp接收端缓冲区的大小是可以调试的,见Netty高级功能(五):IoT百万长连接性能调优

拥塞控制

TCP通过一个定时器(timer)采样了RTT并计算RTO,但是,**如果网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,然而重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这就导致了恶性循环,最终形成“网络风暴” —— TCP的拥塞控制机制就是用于应对这种情况。 **
拥塞控制的问题,也是通过窗口的大小来控制的,即为了在发送端调节所要发送的数据量,定义了一个“拥塞窗口”(Congestion Window),在发送数据时,将拥塞窗口的大小与接收端ack的窗口大小做比较,取较小者作为发送数据量的上限。

所以拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。

TCP 拥塞控制主要来避免两种现象,包丢失和超时重传,一旦出现了这些现象说明发送的太快了,要慢一点。

具体的方法就是发送端慢启动,比如倒水,刚开始倒的很慢,渐渐变快。然后设置一个阈值,当超过这个值的时候就要慢下来

7、总结

通过 TCP 连接传输的数据无差错,不丢失,不重复,且按顺序到达。

  • TCP 报文头里面的序号能使 TCP 的数据按序到达
  • 报文头里面的确认序号能保证不丢包,累计确认及超时重传机制
  • TCP 拥有流量控制及拥塞控制的机制

8、OSI七层协议模型的内容

第一层:物理层
第二层:数据链路层 802.2、802.3ATM、HDLC、FRAME RELAY
第三层:网络层 IP、IPX、ARP、APPLETALK、ICMP
第四层:传输层 TCP、UDP、SPX
第五层:会话层 RPC、SQL、NFS 、X WINDOWS、ASP
第六层:表示层 ASCLL、PICT、TIFF、JPEG、 MIDI、MPEG
第七层:应用层 HTTP,FTP,SNMP等

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

推荐阅读更多精彩内容

  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,051评论 0 8
  • 运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是...
    srtianxia阅读 2,402评论 0 2
  • 转自原文:TCP、UDP以及TCP滑窗,它们的区别注:文中提到TCP传输过程的特点,以及“粘包”的原因和解决方案,...
    半岛夏天阅读 3,476评论 2 31
  • 本文已经优先发表在掘金,请不要重读,浪费时间哦 GitHub 点个赞收藏吧 传输层 本文主要讲的是传输中的两大重要...
    GitCode8阅读 343评论 0 1
  • 前言 相信计算机专业的朋友在大学都学过《计算机网络》这门课程,但据我个人了解计算机专业普通大学生对计算机网络的了解...
    zskingking阅读 3,275评论 5 23