什么是TCP:
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,
TCP的工作方式:(三次握手四次挥手)
- 建立连接 TCP的三次握手
-
- 第一次握手:客户端发送一个TCP的SYN=1,Seq=X的包到服务器端口,客户端进入了人 SYN-sent 状态
-
- 第二次握手:如果同意连接,服务器发回SYN=1, ACK=X+1, Seq=Y的响应包,进入 SYN-received状态
-
- 第三次握手:服务端发送一个确认报文,客户端发送ACK=Y+1, Seq=Z,客户端在发送完成之后就进行了 established连接成功状态,服务端在接收到这个请求之后也进入 ESTABLISHED 状态。此时客户端建立连接完成
- 连接终止 TCP连接的终止 建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如下图所示。
- 第一次挥手:如客户端认为数据完成发送,需要向服务器端发送释放连接的请求。客户端进入 FIN_WAIT_1状态
- 第二次挥手:服务器端接收到客户端的连接释放请求,会告诉应用层要释放 TCP 连接,然后发送 ACK 到客户端,然后进入 CLOSE_WAIT 状态。此时表明客户端到服务器端的连接已经释放,不会接受来自客户端的数据了,但由于 TCP 是全双工的。所以此时服务端还可以向客户端发送数据
- 第三次挥手:服务器端如果在此时数据还没有发送完成,会继续发送,在数据发送完毕之后。服务器端会向客户端发送连接释放请求。然后服务器端进入 LAST_ACK 状态
- 第四次挥手:客户端在接受到服务器端的释放请求,会向服务器端再发送一个确认请求。此时客户端进入 TIME_WAIT 状态,该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃)时间,若该时间内没有服务器端的重发请求的话,就进入 CLOSED 状态。当客户端收到确认应答后,也便进入 CLOSED 状态
注意:
- (1) “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。
- (2) 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。
- (3) 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。 无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。
可靠性的保障:
- 分块传送:应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)。
- 等待确认:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。TCP有延迟确认的功能,在此功能没有打开,则是立即确认。功能打开,则由定时器触发确认时间点。
- 确认回复:收到确认后发送确认回复(不是立即发送,通常推迟几分之一秒)
- 数据校验:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
- 乱序排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
- 重复丢弃:既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
- 流量缓冲:TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。(滑动窗口)
流量控制
什么是流量控制?流量控制的目的?
如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面。
如何实现流量控制?
由滑动窗口协议(连续ARQ协议)实现。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。主要的方式就是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。
流量控制引发的死锁?怎么避免死锁的发生?
当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。 为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。
什么是滑动窗口:
TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报
机制:接收方根据目前缓冲区大小,通知发送方目前能接收的最大值。发送方根据接收方的处理能力来发送数据。通过这种协调机制,防止接收端处理不过来。
窗口大小:接收方发给发送端的这个值称为窗口大小
TCP拥塞控制方法
什么是拥塞呢,在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就会变坏了,这种情况就叫拥塞。网络资源常指网络链路容量(带宽)、交换结点中的缓存和交换处理机。
慢启动:降低分组进入网络的传输速率 拥塞避免:处理丢失分组的算法 快速重传 快速恢复
拥塞控制和流量控制的区别
拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:( 1 )慢开始、拥塞避免( 2 )快重传、快恢复。
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
什么是UDP:
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法
- UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
- UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包而言UDP的额外开销很小。 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
- UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。 虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、显示航空信息等等。- - UDP也用在路由信息协议RIP(Routing Information Protocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中。
UDP和TCP的区别
- 连接性:TCP是面向连接的,UDP是无连接的,即发送前不需要连接
- 双工性:TCP只能是1:1,而UDP是N:M
- 可靠性:TCP是可靠的(重传机制),而UDP是不可靠的(丢包后数据丢失)
- 有序性:TCP有(通过SYN排序)UDP没有
- tcp收到拥塞控制的限制,而udp不受限制;
- 头部大小:TCP首部约为20字节,UDP是8字节
顺便一提的OSI七层模型和五层模型
七层模型
- 1.物理层:传输比特流
- 2.数据链路层:物理寻址(MAC地址),同时将原始的比特流封装成帧
- 3.网络层:控制进行IP寻址的功能
- 4.传输层:接受上一层的数据,在必要的时候,把数据进行分割,并将这些数据交给网络层,且保证这些数据段有效到达对端(TCP/UDP)
- 5.会话层:建立和管理应用程序的通信
- 6.表示层:不同系统之间的通信语法问题
- 7.应用层:各种应用程序协议
五层模型
1)物理层:透明传输比特流
2)数据链路层:无差错地传输以帧为单位的数据
3)网络层:选择路由,网络寻址
4)运输层:为进程间提供可靠的端到端服务
5)应用层:为用户的应用进程提供服务