前⾔
计算机与⽹络设备要相互通信,双⽅就必须基于相同的⽅法。⽐如,如何探测到通信⽬标、由哪⼀边先发起通信、使⽤哪种语⾔进⾏通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这⼀切都需要⼀种规则。⽽我们就把这种规则称为协议(protocol)。
TCP/IP 是互联⽹相关的各类协议族的总称。⽐如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。
【TCP/IP协议是⼀个协议簇。⾥⾯包括很多协议的。UDP只是其中的⼀个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就⽤他两命名了。】
链路层:负责封装和解封装IP报⽂,发送和接受ARP/RARP报⽂等。 ⽹络层:负责路由以及把分组报⽂发送给⽬标⽹络或主机。【处理传输层被分组和重组的报⽂数据包,并且规定以何种⽅式将数据包传输给对⽅】传输层:负责对报⽂进⾏分组和重组,并以TCP或UDP协议格式封装报⽂。【TCP负责对报⽂进⾏分组和重组,为应⽤层提供处于⽹络连接中的两台计算机之间的端到端的数据传输】 应⽤层:负责向⽤户提供应⽤程序,⽐如HTTP、FTP、Telnet、DNS、SMTP等。
手机座充
在⽹络体系结构中⽹络通信的建⽴必须是在通信双⽅的对等层进⾏,不能交错。在整个数据传输过程中,数据在发送端时经过各层时都要附加上相应层的协议头和协议尾(仅数据链路层需要封装协议尾)部分,也就是要对数据进⾏协议封装,以标识对应层所⽤的通信协议。恒功率直流电源
TCP
TCP(Transmission Control Protocol,传输控制协议)是⾯向连接的、可靠的字节流服务。【流就是指不间断的数据结构,你可以把它想象成排⽔管中的⽔流。】
也就是说,在收发数据前,必须和对⽅建⽴可靠的连接。
这⼀过程和打电话类似:先拨号振铃,等待对⽅接电话,说喂,再说⾃⼰是谁。在因特⽹协议族(Internet protocol suite)中,TCP层是位于IP层之上,应⽤层之下的传输层。
当⼀台计算机想要与另⼀台计算机通讯时,两台计算机之间的通信需要畅通且可靠,这样才能保证正确收发数据。
例如,当你想查看⽹页或查看电⼦邮件时,希望完整且按顺序查看⽹页,⽽不丢失任何内容。当你下
载⽂件时,希望获得的是完整的⽂件,⽽不仅仅是⽂件的⼀部分,因为如果数据丢失或乱序,都不是你希望得到的结果,于是就⽤到了TCP。
为什么TCP建⽴连接需要三次握⼿?
防⽌服务器端因为接收了早已失效的连接请求报⽂从⽽⼀直等待客户端请求,从⽽浪费资源。
“已失效的连接请求报⽂段”的产⽣在这样⼀种情况下:Client发出的第⼀个连接请求报⽂段并没有丢失,⽽是在某个⽹络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。这是⼀个早已失效的报⽂段。但Server收到此失效的连接请求报⽂段后,就误认为是Client再次发出的⼀个新的连接请求。
高清视频直播系统于是就向Client发出确认报⽂段,同意建⽴连接。
假设不采⽤“三次握⼿”:只要Server发出确认,新的连接就建⽴了。
由于现在Client并没有发出建⽴连接的请求,因此不会向Server发送数据。
但Server却以为新的运输连接已经建⽴,并⼀直等待Client发来数据。>- 这样,Server的资源就⽩⽩浪费掉了。
1. TCP连接过程
如下图所⽰,可以看到建⽴⼀个TCP连接的过程为(三次握⼿的过程):
第⼀次握⼿
客户端向服务端发送连接请求报⽂段。该报⽂段中包含⾃⾝的数据通讯初始序号。请求发送后,客户端便进⼊ SYN-SENT 状态。
第⼆次握⼿
服务端收到连接请求报⽂段后,如果同意连接,则会发送⼀个应答,该应答中也会包含⾃⾝的数据通讯初始序号,发送完成后便进⼊ SYN-RECEIVED 状态。
第三次握⼿
当客户端收到连接同意的应答后,还要向服务端发送⼀个确认报⽂。客户端发完这个报⽂段后便进⼊ ESTABLISHED 状态,服务端收到这个应答后也进⼊ESTABLISHED 状态,此时连接建⽴成功。
为什么 TCP 建⽴连接需要三次握⼿,⽽不是两次?这是因为这是为了防⽌出现失效的连接请求报⽂段被服务端接收的情况,从⽽产⽣错误。
2. TCP断开链接
TCP 是全双⼯的,在断开连接时两端都需要发送 FIN 和 ACK。
为什么TCP释放连接需要四次挥⼿?
为了保证双⽅都能通知对⽅“需要释放连接”,即在释放连接后都⽆法接收或发送消息给对⽅。
需要明确的是:TCP是全双⼯模式,这意味着是双向都可以发送、接收的
释放连接的定义是:双⽅都⽆法接收或发送消息给对⽅,是双向的
当主机1发出“释放连接请求”(FIN报⽂段)时,只是表⽰主机1已经没有数据要发送 / 数据已经全部发送完毕;
但是,这个时候主机1还是可以接受来⾃主机2的数据。
当主机2返回“确认释放连接”信息(ACK报⽂段)时,表⽰它已经知道主机1没有数据发送了
但此时主机2还是可以发送数据给主机1
当主机2也发送了FIN报⽂段时,即告诉主机1我也没有数据要发送了
此时,主机1和2已经⽆法进⾏通信:主机1⽆法发送数据给主机2,主机2也⽆法发送数据给主机1,此时,TCP的连接才算释放
第⼀次挥⼿
若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。【此时请求的是释放客户端A到服务端B的连接,由客户端A先发出】
第⼆次挥⼿
B 收到连接释放请求后,会告诉应⽤层要释放 TCP 链接。然后会发送 ACK 包,并进⼊ CLOSE_WAIT 状态;【客户端A收到服务端B发送的ACK包后,即客户端到服务器的连接已经释放】
折叠篮此时表明 A 到 B 的连接已经释放,不再接收 A 发的数据了【但是此时B到A的连接却还没有释放】。但是因为 TCP 连接是双向的,所以 B 仍旧可以发送数据给 A。
第三次挥⼿
服务端B如果此时还有没发完的数据会继续发送,完毕后会向客户端A发送连接释放请求,然后 B 便进⼊ LAST-ACK 状态。【此时请求的是释放服务端B到客户端A的连接,由服务端B发出】
第四次挥⼿
A 收到释放请求后,向
B 发送确认应答,此时 A 进⼊ TIME-WAIT 状态。该状态会持续 2MSL(最⼤段⽣存期,指报⽂段在⽹络中⽣存的时间,超时会被抛弃)时间,若该时间段内没有 B 的重发请求的话,就进⼊ CLOSED 状态。当 B 收到确认应答后,也便进⼊ CLOSED 状态。【服务端B收到客户端A发送的ACK包后,即表⽰服务端到客户端的连接已经释放】
3. TCP协议的特点
⾯向连接
⾯向连接,是指发送数据之前必须在两端建⽴连接。建⽴连接的⽅法是“三次握⼿”,这样能建⽴可靠的连接。建⽴连接,是为数据的可靠传输打下了基础。
仅⽀持单播传输
每条TCP传输连接只能有两个端点,只能进⾏点对点【⼜叫端到端】的数据传输,不⽀持多播和⼴播传输⽅式。
⾯向字节流
流,指的是流⼊到进程或从进程流出的字符序列。简单来说,虽然有时候要传输的数据流太⼤,TCP报⽂长度有限制,不能⼀次传输完,要把它分为好⼏个数据块,但是由于可靠性保证,接收⽅可以按顺序接收数据块然后重新组成分块之前的数据流,所以TCP看起来就像直接互相传输字节流⼀样,⾯向字节流。
人体3d建模
TCP不像UDP⼀样那样⼀个个报⽂独⽴地传输,⽽是在不保留报⽂边界的情况下以字节流⽅式进⾏传输【分割报⽂】。
可靠传输
对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。TCP为了保证报⽂传输的可靠,就给每个包⼀个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回⼀个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
提供拥塞控制
当⽹络出现拥塞的时候,TCP能够减⼩向⽹络注⼊数据的速率和数量,缓解拥塞。【但是UDP在数据传输中始终以稳定的速率传输,不考虑⽹络堵塞,所以UDP协议没有拥塞控制】
TCP提供全双⼯通信
TCP允许通信双⽅的应⽤程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,⽤来临时存放双向通信的数据。当然,TCP可以⽴即发送⼀个数据段,也可以缓存⼀段时间以便⼀次发送更多的数据段(最⼤的数据段⼤⼩取决于MSS)
UDP
UDP (User Datagram Protocol,⽤户数据报协议),是OSI(Open System Interconnection,开放式系统互联) 参考模型中⼀种⾮连接的传输层协议,提供⾯向事务的简单不可靠信息传送服务,传输数
据之前源端和终端不建⽴连接,当它想传送时就简单地去抓取来⾃应⽤程序的数据,并尽可能快地把它扔到⽹络上,故也不安全。
UDP协议全称是⽤户数据报协议,在⽹络中它与TCP协议⼀样⽤于处理数据包,是⼀种⽆连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上⼀层。
UDP有不提供数据包分组、组装和不能对数据包进⾏排序的缺点,也就是说,当报⽂发送之后,是⽆法得知其是否安全完整到达的。
TCP协议的特点
1、⾯向⽆连接
⾸先UDP 是不需要和 TCP⼀样在发送数据前进⾏三次握⼿建⽴连接的,想发数据就可以开始发送了。并且也只是数据报⽂的搬运⼯,不会对数据报⽂进⾏任何拆分和拼接操作。就像写信,在信封写上收信⼈名称、地址就可以交给邮局发送了,⾄于能不能送到,就要看邮局的送信能⼒和送信过程的困难程度了。
具体来说就是:
在发送端,应⽤层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加⼀个 UDP 头标识下是 UDP 协议,然后就传递给⽹络层了。【如果使⽤TCP协议,TCP会对报⽂进⾏分组和重组】
在接收端,⽹络层将数据传递给传输层,UDP 只去除 IP 报⽂头就传递给应⽤层,不会任何拼接操作
2、有单播,多播,⼴播的功能
UDP 不⽌⽀持⼀对⼀的传输⽅式,同样⽀持⼀对多,多对多,多对⼀的⽅式,也就是说 UDP 提供了单播,多播,⼴播的功能。
3、UDP是⾯向报⽂的
发送⽅的UDP对应⽤程序交下来的报⽂,在添加⾸部后就向下交付IP层。UDP对应⽤层交下来的报⽂,既不合并,也不拆分,⽽是保留这些报⽂的边界。因此,应⽤程序必须选择合适⼤⼩的报⽂。【数据报⽂,就相当于⼀个数据包,应⽤层交给UDP多⼤的数据包,UDP就照样发送,不会像TCP那样拆分。】
4. 不可靠性
⾸先不可靠性体现在⽆连接上,通信都不需要建⽴连接,想发就发,这样的情况肯定不可靠。
并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关⼼对⽅是否已经正确接收到数据了。
再者⽹络环境时好时坏,但是 UDP 因为没有拥塞控制,⼀直会以恒定的速度发送数据。即使⽹络条件不好,也不会对发送速率进⾏调整。这样实现的弊端就是在⽹络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求⾼的场景(⽐如电话会议)就需要使⽤ UDP ⽽不是 TCP。【因为UDP 发出去的数据包发出去就不管了,不管它会不会到达,所以很可能会出现丢包现象,使传输的数据出错。】
从上⾯的动态图可以得知,UDP只会把想发的数据报⽂⼀股脑的丢给对⽅,并不在意数据有⽆安全完整到达。
5、没有拥塞控制
拥塞,是指到达通信⼦⽹中某⼀部分的分组数量过多【⽐如报⽂到达传输层时,TCP协议会将报⽂分割成⼀段段的形式发送,在⽹络不好的情况下会造成拥塞】,使得该部分⽹络来不及处理,以致引起这部分乃⾄整个⽹络性能下降的现象,严重时甚⾄会导致⽹络通信业务陷⼊停顿,即出现死锁现象,就像交通堵塞⼀样。
TCP建⽴连接后如果发送的数据因为信道质量的原因不能到达⽬的地,它会不断重发,有可能导致越来越塞,所以需要⼀个复杂的原理来控制拥塞。⽽UDP 就没有这个烦恼,发出去就不管了。
TCP和UDP的⽐较
1. 对⽐
UDP TCP
是否连接⽆连接⾯向连接
是否可靠不可靠传输,不使⽤流量控制和拥塞控制可靠传输,使⽤流量控制和拥塞控制
连接对象个数⽀持⼀对⼀,⼀对多,多对⼀和多对多交互通信只能是⼀对⼀通信【端到端通信】
传输⽅式⾯向报⽂⾯向字节流
⾸部开销⾸部开销⼩,仅8字节⾸部最⼩20字节,最⼤60字节
适⽤场景适⽤于实时应⽤(IP电话、视频会议、直播等)适⽤于要求可靠传输的应⽤,例如⽂件传输
2. 总结
1) TCP提供⾯向连接的传输,通信前要先建⽴连接(三次握⼿机制); UDP提供⽆连接的传输,通信前不需要建⽴连接。
2) TCP提供可靠的传输(数据的顺序有序,数据准确⽆差错,数据不丢失,数据不重复); UDP提供不可靠的传输(可能丢包,不保证数据顺序)。
3) TCP⾯向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是⾯向数据报的传输,没有分组开销。
4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。
5)对系统资源的要求:TCP较多(TCP头部有20个字节信息包),UDP少(UDP信息包只有8个字节)
6)虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求⾼的地⽅有所作为。
7)对数据准确性要求⾼,速度可以相对较慢的,可以选⽤TCP
UDP协议实际应⽤场景
很多的实时应⽤(如IP电话、实时视频会议、某些多⼈同时在线游戏等)要求源主机以恒定的速率发送数据,并且允许在⽹络发⽣拥塞时候丢失⼀些数据,但是要求不能有太⼤的延时,UDP就刚好适合这种要求。所以说,只有不适合的技术,没有真正没⽤的技术。