1:udp与tcp区别
- TCP是面向链接的协议,UDP是无连接的。
- TCP消耗的系统资源多与UDP消耗的系统资源
- TCP保证可靠的数据传输,UDP传输是不可靠的
- TCP保证数据传输的有序性
- TCP面向字节流,UDP面向数据报
- TCP具有拥塞控制,UDP没有
2:TCP三次握手
建立连接需要三次握手
第一次握手:主机A向主机B发送一个含有同步序列号的标志位的数据段给主机B,向主机B请求连接,通过这个数据段,主机A告诉主机B两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我
第二次握手:主机B收到主机A的请求,用一个带有确认应答(ACK)
和同步序列号(SYN)
标志位的数据段相应主机A,同时也告诉主机A两件事:我已经接收到你的请求,你可以传输数据了;你要用那个序列号作为起始数据段来回应我
第三次握手:主机A收到这个数据段之后,再发送一个确认应答,确认已收到主机B数据段:我已收到回复,即将开始传输数据
3:TCP为什么要三次握手
- 第三次握手是为了防止失效的连接请求到服务器,让服务器错打开连接
- “三次握手”的目的就是让双方都能够明确自己和对方收发能力是正常的
- 第一次握手:客户端发送,服务端接收。表明客户端发送能力,服务端接受能力正常
- 第二次握手:服务端发送,客户端接收。表明客户端接收能力,服务端发送能力正常。**客户端视角下:**我第一次发送的网络包服务端接收成功并作出了响应,所以客户端知道了自己与服务端的接收,发送能力都正常
- 第三次握手:但是此时服务端只知道自己的发送能力正常,所以此次客户端发送,服务端接收。**服务端视角下:**我第二次握手发送的网络阿波已被客户端接收并成功响应,所以服务端知道了自己与客户端的接收,发送能力正常。
- 经过三次握手后,客户端与服务端都知道了彼此双发的发送,接收能力正常
4:TCP四次挥手
断开连接需要四次挥手
第一次:当主机A完成数据传输后,将控制FIN
置1,提出停止TCP连接的请求
第二次:主机B收到FIN
后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
第三次:由B端再提出反向的关闭连接请求,将FIN
置1
第四次:主机A对主机B的请求进行确认,将ACK置1,双方连接关闭
5:TCP为什么要四次挥手
- TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送数据或接收数据。当有一方要关闭连接时,会发送指令告知对方,我要关闭连接了。
- 这时对方会回应一个ACK,此时一个方向的连接已关闭。但是另外一个方向依旧可以传输数据,也就是说,服务端收到客户端的FIN标志,知道客户端要断开这个连接,但是我服务端还想发送数据,等我发送完数据后会发送一个FIN段来关闭此方向的连接,接收方发送ACK确认关闭
- 客户端发送了FIN连接释放报文后,服务器接收到了这个报文,进入了CLOSE-WAIT状态。这个状态是为了让服务器端发送还未传输完的数据,传送完毕后,服务器会发送FIN连接释放报文
- 引文服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了,但是还能接收数据,己方是否现在关闭发送数据通道,还需要上层来决定
6:TCP的可靠传输
TCP使用超时重传来实现可靠传输:如果一个已经发送的报文段在超过时间内没有收到确认,那么久重传这个报文段。
7:TCP滑动窗口
窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过TCP报文段中的窗口来告诉自己发送方自己窗口的大小,发送方根据这个值来设置自己的窗口的大小。
如果发送窗口左部字节已经发送并收到了确认,那么就将发送窗口向右滑动一定的距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口类似
接收方只会对窗口内最后一个按序到达的字节进行确认
8:TCP流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口的大小,从而影响发送方的发送速率。
若将窗口字段设置为0,则表示不能发送数据。
9:TCP拥塞控制
若网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。
因此当网络发送拥堵时,应该控制发送方的速率,以降低整个网络的拥塞程度。
TCP主要通过四个算法来进行拥塞控制
发送方会维持一个叫拥塞窗口(cwnd)
的变量
1:慢开始与拥塞避免
发送的最初执行慢开始,令cwnd=1
,发送方只能发送一个报文段,当收到确认时,令cwnd加倍,之后能够发送报文段的数量为2,4,8……
每次都使cwnd加倍,会导致cwnd增长速度非常快,从而使发送方发送速率增长速度过快,网络拥塞可能性就更高。设置一个ssthresh
,当cwnd>=ssthresh
时,进入拥塞避免,每轮只将cwnd加1
若出现了超时,将ssthresh=cwnd/2
2:快重传与快速恢复
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。