【计算机网络】传输层

iso七层模型 TCP/IP四层模型 对比:

图片说明

UDP协议(User Datagram protocol用户数据报协议)

UDP协议的位置:
位于ip数据报的数据部分
由两个部分组成:
UDP首部、UDP数据报的数据

特点:
无连接、不能保证数据的可靠交付、面向报文传输的协议(直接将应用层输出过来的数据放进UDP数据报的数据中)、没有拥塞控制、首部开销小

TCP协议(Transmission Control Protocol传输控制协议)

  1. TCP协议的位置:
    图片说明
  2. 特点:
    面向连接的协议、提供可靠的传输服务、端到端通信、提供全双工的通信、面向字节流的协议
  3. TCP头部
1. 序号:当前数据报的首字节的序号(配合确认号使用)
2. 确认号:期待收到的下一个数据报的首字节序号
3. 数据偏移:
4. TCP标记
5. 窗口
6. 紧急指针
  1. 可靠传输的基本原理
    1. 停止等待协议
      最简单的可靠重传协议,信道利用率低
      设置一个定时器:超时重传定时器
    2. 连续ARQ协议(Automatic rePeat reQuest )
      滑动窗口:发送窗口内的消息,前部的发送完毕(通过确认号),窗口就往后滑动
      累计确认:发送了确认号5,说明1-5都发送完毕,可以开始发送6及之后的报文了,减少确认报文的数量
  1. TCP可靠传输
    重传,如果部分字节收到了确认消息,而开头的没有收到,那也不行,必须这一段报文全部重传。
    TCP选项最多40个字节,一个序号4个字节,所以最多存储10个序号

TCP选项存储的是需要重传的字节流的边界,比如:存储了1000、1500,代表的是需要重传1000~1500的所有字节

  1. TCP流量控制
    流量控制:
    指发送方发送速率不要太快,通过滑动窗口实现

如果前一个流量控制消息中的窗口设置大小为0,下一个设置窗口的消息在路上丢失了,则会进入一个死锁状态:发送方一直认为窗口大小为0,接收方在等待发送方发送消息(如下图)

坚持定时器:

  1. TCP拥塞控制
    拥塞控制:

慢启动算法:慢启动算法每次的发送量是指数形式增长的

拥塞避免:设置慢启动阈值,先是指数增长,达到阈值以后缓慢增长(+1)

三次握手

描述逻辑:三次握手的报文消息(TCP选项位、序列号、确认号)——两方状态变化

  1. 第一次握手:建立连接之前,接收方处于监听状态(Listen),发送方 向 接受方 发送连接请求报文,发送报文的序列号为x;、
  2. 接收方收到连接请求报文以后进行回复,进行第二次握手,确认号ack为x+1,代表接受方希望下一次接收到发送方发来为起始位置为x+1的数据,序列号seq为y,代表接收方发送的数据序列号为y;
  3. 第三次握手:序列号seq为x+1,代表发送的数据的序列号也就是第一个字节流的序号为x+1,确认号ack=y+1代表发送方希望下一次接收到序列号为y+1的数据;

状态变化:

发送方:同步已发送(SYNC-SENT)——建立连接(ESTABLISHED)
接收方:监听(LISTEN)——同步已接收(SYNC-RECV)——建立连接(ESTABLISHED)

经典问题:

1. 为什么需要三次握手,为什么两次握手不行?

回答逻辑:先说结论,再解释过程原理
结论:只有两次握手的情况下,已经失效的连接请求报文如果传送到接收方,会引发错误
解释:请求连接报文可能会因为网络节点阻塞的原因丢失或者迟到。
如果只有两次握手,因为存在超时重传机制,如果前一个请求阻塞在网络节点中,后发送的请求报文已经建立起TCP连接,迟到的连接请求报文也会得到接受方的响应,建立起连接,这样就建立起多个连接,就发生了错误

2. 三次握手如何解决这个问题?

三次握手的情况下,接受方接收到第一个连接请求报文时,就给发送方回复确认报文,在第二次握手完成以后发送方就不会再理会新的确认报文,这样就避免了建立多个TCP连接的情况。

四次挥手

描述四次挥手过程要点:挥手发送的消息的字段(FIN、ACK);每次挥手的含义,以及挥手引起两方状态变化

描述一下四次挥手的具体过程:

  1. 首先发送方数据传输完毕,向接收方发送一个Fin标记为1的连接中断报文。意思是,我的数据已经传输完毕,我关闭了数据传输,你那边可以继续传输数据给我,不用着急关闭连接。然后发送方进入FIn-WAIT1状态
  2. 接收方接收到连接中断报文以后,给发送方回复一个ACK确认报文。意思是,我知道你的消息已经发送完毕了,但是目前我还有数据需要发送,请你继续接收数据。接收方发送ACK确认报文后进入CLOSE-WAIT状态,在这个状态中可以继续发送数据,当发送方接收到第一个ACK确认报文后进入FIN-WAIT2状态,继续接受数据,第二次挥手完成
  3. 当接收方数据全部传输完毕以后,会发送一个中断连接报文,既包含FIN,代表这是接收方的中断连接报文,也包含ACK确认,是对发送方的Fin报文的再一次确认,接收方进入LAST-ACK最后确认状态
  4. 发送方接收到接收方发来的FIN中断连接报文以后,也就是第三次挥手以后,会响应发送一个ACK确认报文,并设置一个等待计时器,等待2MSL的时间后关闭连接,进入关闭状态;接收方在接收到这个ACK确认报文后也关闭连接,进入关闭状态,自此四次握手完成,TCP连接正式关闭

图片说明

关于2MSL:

定义:最后的第四次挥手的ACK消息在网络中能够存活的最长的时间
如何实现等待:网络端口在这2MSL中,会被一直占用,不能释放,不能被复用

经典问题:

  1. 为什么要四次挥手?三次挥手行不行?
    第四次挥手是为了让接收方知道发送方收到了第三次挥手的消息,如果没有第四次挥手,接收方就无法得知发送方是否正常关闭了连接
  1. 为什么要等待2MSL? 两个作用!
    1. 确保发送方的最后一个ACK报文可以到达接收方
    2. 确保连接中的所有消息全部过期失效
      图片说明