学习小记 -- TCP和UDP

最近重温了计算机网络的知识,趁着还热乎,赶紧🐎一下。本节先介绍一下传输层吧,毕竟传输层是重中之重!

目录

知识体系框架

传输层功能

 UDP

UDP优点

UDP数据报组成

UDP校验

TCP

TCP报文段

TCP连接管理

总结

TCP和UDP的区别


知识体系框架

传输层功能

  1. 提供应用进程间的逻辑通信(网路层提供主机之间的逻辑通信)。
  2. 差错校验:对收到报文的首部和数据部分进行差错校验。
  3. 提供无连接或面向连接的服务。
    1. 面向连接的TCP。
      1. 连接管理。
      2. 流量控制与拥塞控制。
    2. 无连接的UDP。
  4. 复用和分用。

 套接字 = 主机IP地址+端口号

它唯一地标识了网络中的某台主机上的某个应用进程。

 UDP

UDP 和TCP最大的区别在于它是无连接的,UDP其实只在IP的数据报服务之上增加了端口的功能(为了找到进程)和差错检测的功能。

UDP优点

  1. 发送数据之前不需要建立连接。
  2. UDP的主机不需要维持复杂额连接状态表。
  3. UDP用户数据报只有8个字节的首部开销。
  4. 网络出现的拥塞不会使源主机的发送速率降低(没有拥塞控制)。这对某些实时应用是很重要的。
  5. UDP支持一对一,一对多,多对一和多对多的交互通信。

UDP数据报组成

UDP数据报有两个字段:数据字段和首部字段。首部字段有8B,由4个字段组成。

特别说明一下校验和:占2B,用来检测UDP用户数据报在传输中是否有错(既检验首部,又检验数据部分),如果有错,就直接丢弃。若该字段为可选字段,当源主机不想计算校验和时,则直接令该字段为全0。校验范围:伪首部,UDP数据报的首部和数据。其中,在计算校验和时临时生产伪首部。 

UDP校验

UDP校验只提供差错校验。在计算时,会在数据报之前临时加上12B的伪首部,伪首部只用于计算和验证校验和,起既不向下传送,也不向上递交。

计算规则:将伪首部,UDP首部,数据,以及全0字段进行二进制反码求和,二进制反码计算后,当无差错时其结果应该全为1,否则就表明有差错出现,接收方就应该丢弃这个UDP报文。

TCP

TCP报文段

  1. 源端口和目的端口:各占2B。
  2. 序号:占4B。TCP是面向字节流的,所以在一个TCP连接中传送的字节流需要编号,保证按序号交付。
  3. 确认号:占4B。TCP是含确认机制的:若确认号=N,则表明到序号N-1为止的所有数据都已经正确收到。
  4. 数据偏移:这里的数据偏移不是IP数据报中分片的那个数据偏移,而是表示首部长度。
  5. 紧急比特URG:当URG=1时,不进入接收缓冲,直接交付给应用层。
  6. 确认比特ACK:只有当ACK=1时,确认号字段才有效。
  7. 推送比特PSH:当PSH=1时的报文,不等待缓冲填满,经快交付给应用进程(仍然是从缓冲区中交付)。
  8. 复位比特RST:当RST=1时,表明TCP连接中有严重差错,必须释放连接。
  9. 同步比特SYN:当SYN=1时,表示这是一个连接请求或者连接接受报文。
  10. 终止比特FIN:当FIN=1时,表示要求释放传送连接。
  11. 窗口字段:占2B:用来控制对方发送的数据量,单位为字节
  12. 填充字段:为了使整个首部长度时4B的整数倍。

TCP连接管理

分为三个阶段:连接建立,数据传送和连接释放。也就是常说的三次握手。

一旦数据传输结束,参与传输的任何一方都可以请求释放传输连接,过程需要经历4部,即4次挥手 。

第一步:A请求释放连接,报文段首部FIN = 1,序号seq=u.

第二步:B发出确认,确认号ack = u+1,seq = v.

第三步:若B已经没有要向A发送的数据,通知tcp释放连接。seq = w,FIN =1,ack =u+1,ACK = 1

第四步:A收到连接释放报文后,发出确认,ACK=1,seq=u+1,ack=w+1

 问:为什么不使用2次握手,而使用三次握手?

 答:三位握手主要有以下三个原因:

  • 三次握手才可以阻止历史重复连接的初始化(主要原因)

  • 三次握手才可以同步双方的初始序列号

  • 三次握手才可以避免资源浪费

例1:客户端连续发送多次 SYN 建立连接的报文,在网络拥堵等情况下:一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端;服务端返回ack和seq,客户端可以根据自己的上下文来对比接收到的ack,来判断是历史连接还是新连接,如果是历史连接则终止这次连接。

例2:2次握手可能会发生死锁。A和B之间通信,A给B发连接请求,B收到了请求后,发送应答,如果是2次握手,B现在已经认为连接已经成功建立了,那么若B发送给A的应答报文丢失的话,A并不知道B是不是收到连接请求了,所以A会认为连接还未建立成功,就会忽略B发来的任何数据,值接收B的应答数据,但是B发出的分组超时,就会重复发送同样的分组,形成死锁。

 问:为什么不采用三次挥手,而采用四次,且最后一次要等待2MSL?

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。

  • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

所以服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次。

如果不等待2MSL,A返回的最后确认报文段丢失,则B不能进入正常关闭状态,而A此时已经关闭,也不可能再重传。为了防止已经失效的历史连接请求,在经过2MSL可以保证本连接持续的时间内所产生的所有报文段从网络中消失。

问:在 FIN_WAIT_2 状态下,是如何处理收到的乱序到 FIN 报文,然后 TCP 连接又是什么时候才进入到 TIME_WAIT 状态?

答:

在 FIN_WAIT_2 状态时,如果收到乱序的 FIN 报文,那么就被会加入到「乱序队列」,并不会进入到 TIME_WAIT 状态。

等再次收到前面被网络延迟的数据包时,会判断乱序队列有没有数据,然后会检测乱序队列中是否有可用的数据,如果能在乱序队列中找到与当前报文的序列号保持的顺序的报文,就会看该报文是否有 FIN 标志,如果发现有 FIN 标志,这时才会进入 TIME_WAIT 状态

问:客户端在进入 TIME_WAIT 状态后,收到了服务端的数据包,应用程序还能读取到该数据吗?

 答:客户端进入 TIME_WAIT 状态后,如果收到了服务端的数据包,客户端的内核会发送该数据包的 ACK 确认报文,然后丢掉该数据包。

总结

TCP和UDP的区别

TCPUDP
面向连接服务无连接服务
字节流接口IP数据报接口
有流量控制无流量控制
有拥塞控制无拥塞控制
保证可靠性不保证可靠性
无丢失

可能丢失

无重复可能重复
按序交付可能失序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值