TCP/IP

一、tcp拥塞控制


拥塞控制算法:

  • 慢开始
假设发送方拥塞窗口cwnd为1,而发送窗口swnd等于拥塞窗口cwnd,因为发送方只能发送一个数据报文段,接收方收到该数据报文段后,给发送方回复一个确认报文段,发送方收到确认报文段后,将拥塞窗口变为2。依次,拥塞窗口变为16。达到慢开始门限值(初始慢开始门限值是16),改用拥塞避免算法。
  • 拥塞避免
拥塞窗口cwnd性能加1。16+1....直到24,将设24个报文段在传输中丢失4个,接收方依次回复20个确认报文段,一段时间后,丢失4个报文段的重传计时器超时了,发送方判断出现拥塞,将慢开始门限值更改为20的一半,cwnd为1,重新开始慢开始算法。
  • 快重传
发送方收到3个连续的重复确认,就将相应的报文段立即重传,而不是等待报文段的超时重传计时器超时再重传。
  • 快恢复
发送方收到3个重复确认,就知道只是丢失了个别的报文段,于是不启动慢开始算法,而是执行快恢复算法。--发送方将慢开始门限值和拥塞窗口调整为当前窗口的一半,开始执行拥塞避免算法。

参考链接

二、三次握手/四次挥手

  • 三次握手
    image
1. TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求,此时服务器进入LISTEN状态
2. TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,报文首部中的同部位SYN=1,初始序列号seq=x,此时,TCP客户端进程进入SYN-SENT状态
3. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中ACK=1,SYN=1,确认号ack=x+1,自己初始化的序列号seq=y,此时TCP服务器进程进入SYN-RECV状态。
4. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,确认序列号ack=y+1,自己的序列号seq=x+1,此时,tcp连接建立,客户端进入ESTABLISHED状态。
5. 当服务器收到客户端的确认好号后也进入ESTABLISHED状态,此后双方就可以开始通信。
  • 四次挥手
    image
1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部FIN=1,序列号为seq=u,此时客户端进入FIN-WAIT-1状态
2. 服务器收到连接释放报文,发出确认报文,ACK=1,确认序号ack=u+1,自己的序列号seq=v,此时服务器就进入CLOSE-WAIT状态
3. 客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2状态,等待服务器发送连接释放报文
4. 服务器将最后的数据发送完毕后,就像客户端发送连接释放报文,FIN=1,ACK=1确认序号ack=u+1,自己的序号seq=w,此时服务器进入LAST_ACK状态,等待客户端的确认
5. 客户端收到服务器的连接释放报文后,发出确认报文,ACK=1,确认序号ack=w+1,自己的序列号seq=u+1,此时客户端就进入TIME-WAIT状态。
6. 服务器收到客户端的确认后,进入CLOSED状态。同样,撤销TCB后就结束这次的TCP连接。
  • 为什么需要三次握手
1、如果是两次握手,假设服务器给客户端在第二次握手时发送数据,数据发出,服务器认为连接已建立,但在发送过程中数据丢失,客户端认为连接没有建立会进行重传。假设每次发送的数据一直丢失,客户端一直SYN,服务器就会有多个无效连接,占用资源,服务器可能会挂掉
2、第一次请求没有丢失而是在网络中滞留时间长,二次握手情况下第二次重传已经建立连接,第一次的请求到达服务器,这个报文是无效的,但两次握手的机制会让客户端和服务器再建连接,造成资源浪费。
  • 挥手客户端TIME_WAIT要等2msl
1. 保证客户端发送的最后一个ACK报文能够达到服务器
2. 防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
  • 为什么握手三次、关闭四次
1. 建立连接的时候,服务器收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
2. 关闭连接时,服务器收到对方的FIN报文时,表示对方不再发送数据了但自己可能还有数据需发送给对方,所以服务端可以发送一些数据给客户端后,再发送FIN报文给对方来表示同意现在关闭连接,服务端ACK和FIN分开发送。
  • tcp过多TIME_WAIT的原因
在高并发短连接的TCP服务器上,主动关闭方发送最后一个ACK报文后就进入TIME_WAIT状态停留2MSL时间,这个场景下就会有大量socket处于TIMEWAIT状态。
  • 服务端为什么需要CLOSE_WAIT
客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  • 如果建立了连接,客户端出现故障了怎么办
TCP有一个保活计时器。服务器每收到一次客户端的请求后会重新复位这个计时器,时间通常为2小时,若两小时没收到客户端数据,服务器就会发送一个探测报文段,每75分钟分送一次,若连续10个探测报文都没反应,服务器就认为客户端故障,关闭连接。

参考链接

一、tcp/udp区别

1. TCP是面向连接的,可靠性高;UDP是基于非连接的,可靠性低
2. TCP需要三次握手等连接过程,实时性差。UDP没有建立连接的过程,实时性强
3. TCP首部开销20个字节,UDP首部开销8字节(TCP在IP协议基础上添加了序号机制、确认机制、超时重传机制等,保证了传输的可靠,不会出现丢包或乱序)
4. TCP连接只能点到点,DUP支持一对多,多对多通信
posted @ 2022-02-21 09:54  曾某某scau  阅读(66)  评论(0编辑  收藏  举报