TCP相关知识点 | 青训营笔记

88 阅读7分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第7天。

TCP头格式

  • 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机,每发送一次数据,就累加一次该数据字节数的大小。用来解决网络包乱序问题。
  • 确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
  • 控制位。

为什么需要TCP协议?TCP工作在哪一层?

  • IP层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付,也不保证网络包中数据的完整性。
  • 如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的TCP协议来负责。
  • 因为TCP是一个工作在传输层的可靠数据传输的服务。它能确保接收的网络包是无损坏、无间隔、非冗余和按序的。

什么是TCP?

  • TCP是面向连接的、可靠的、基于字节流的传输层通信协议。
  • 面向连接:一定是一对一才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多无法做到的。
  • 可靠的:无论网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端。
  • 字节流:消息是没有边界的,所以无论我们消息有多大都可以进行传输。并且消息是有序的,当前一个消息没有收到时,即使它先收到了后面的字节,那么也不能扔给应用层去处理,同时对重复的报文会自动丢弃。

TCP三次握手哪一次最容易被攻击?

TCP三次握手在第二阶段容易受到攻击,即syn溢出攻击,如果客户机伪造出大量第一次的sys同步报文,服务端就会依次消耗掉很多资源来保存客户端的信息,并进行确认,实际上确认是会失败的,但失败需要一定的时间,因为服务端会连续多次进行第二次握手确认后才认定失败。那么短时间有大量的sys同步报文涌向服务端,服务端资源可能被耗尽,就可能导致正常的客户端得不到响应而失败。

什么是TCP连接?

用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。

TCP和UDP有什么区别呢?

  1. 连接: TCP是面向连接的传输层协议,传输数据前要先建立连接。UDP是不需要连接,即刻传输数据。
  2. 服务对象: TCP是一对一的两点服务,即一条连接的只有两个端点。UDP支持一对一、一对多、多对多的交互通信。
  3. 可靠性: TCP是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。UDP是尽最大努力交付,不保证可靠交付数据。
  4. 拥塞控制、流量控制: TCP有拥塞控制和流量控制机制,保证数据传输的安全性。UDP则没有,即使网络非常拥堵了,也不会影响UDP的发送速率。
  5. 首部开销: TCP首部长度较长,会有一定的开销,首部在没有使用选项字段时是20个字节,如果使用了选项字段则会变长。UDP首部只有8个字节,并且是固定不变的,开销较小。
  6. 传输方式: TCP是流式传输,没有边界,但保证顺序和可靠。UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
  7. 分片不同

TCP和UDP应用场景

  • 由于TCP是面向连接的,能保证数据的可靠性交付,因此经常用于FTP文件传输。
  • 由于UDP面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:包总量较少的通信,如DNS、SNMP等。视频、音频等多媒体通信、广播通信。

为什么是三次握手?不是两次、四次?

  1. 首要原因是为了避免历史连接

    • 由于网络拥堵,一个旧的SYN报文先到了

    • 服务求回了SYN+ACK

    • 客户端根据服务器的ACK判断是回RST还是ACK

      若只有两次链接,无法判断当前连接是否为历史连接。

  2. 同步双方初始序列号

    • 可以去重

    • 可以保证数据按序接收

    • 可以标识发出的数据中哪些是已被接收

      四次浪费,二三可以合成一步。两次不足,没法保证双方序列号都被确认接收。

  3. 避免资源浪费:消息滞留情况下,两次握手会导致服务器重复接受无用的SYN报文,而造成重复分配资源。


  4. 避免历史连接及服务端资源浪费

    如果是两次握⼿,那么当客户端接收到服务端请求和确认报⽂后TCP连接建⽴。如果此时⽹络状态拥塞,客户端早期发送的请求连接报⽂未到达服务端⽽发⽣重传。后正常建⽴连接,传输完毕后断开连接。但断开后早期的报⽂又被服务端所接收,那么服务端会误认为客户端再次发起连接,因此向客户端返回确认及请求连接报⽂,导致错误发⽣。并且由于此时客户端已断开,服务端⽆法收到客户端进⼀步的报⽂信息,造成服务端为为⽆效连接分配资源,造成浪费。

  5. 同步双⽅序列号

    TCP中序列号和确认应答机制保障了传输的可靠性,因此当第⼆次握手时服务端向客户端发送请求报⽂时,需要客户端返回确认报⽂才保障双⽅序列号被可靠同步。如果仅有两次握⼿,只保证了客户端序列号的可靠性。

为什么挥手需要四次?

服务端通常需要等待完成数据的发送和处理,所以服务端的ACK和FIN一般都会分开发。

TCP拥塞控制和流量控制的区别?

  1. 拥塞控制是为了防止过多的数据注入到网络中

    这样就可以使网络中的路由器或链路不至过载。拥塞控制所要做的都有⼀个前提,就是⽹络能够承受现有的⽹络负荷。拥塞控制是⼀个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低⽹络传输性能有关的所有因素。

  2. 流量控制往往是点对点通信量的控制

    是个端到端的问题。流量控制所要作到的是抑制发送端发送数据的速率,以便使接收端来得及接收。

TCP粘包

TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

粘包出现原因:在流传输中出现,UDP不会出现粘包,因为它有消息边界

粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包。

为了避免粘包现象,可采取以下几种措施:

(1)对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;

(2)对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;

(3)由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。分包多发。