TCP、UDP

124 阅读5分钟

【】是没想起来的

连接?

什么是连接?

RFC793:

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

  • 【SOCKET:四元组,源/目的/主机号/端口号】
  • 【序列号:用于解决乱序问题】
  • 【窗口大小:用于流量控制】

TCP?

transmission control protocol,传输控制协议,是可靠的,面向连接的,基于字节流的传输层通信协议

  • 可靠的,通过一些机制保证数据包的到达,按序,不损坏(IP是不可靠的,不可靠体现在不保证交付,不保证按序交付,不保证交付后的数据包是否完好无损)
  • 面向连接的,【一对一的连接】(UDP不是面向连接的,不需要三次握手四次挥手,可以一对一一对多)
  • 基于字节流的,TCP的消息是没有边界的,是基于字节流的,收到重复的报文会丢弃

TCP首部格式

image.png

  • 16位源端口号
  • 16为目的端口号
  • 32位序列号
  • 32位确认应答号
  • 首部长度,TCP首部长度在没有额外选项的情况下是20字节,但是可能有额外选项,所以需要次字段
  • 【URG,紧急指针生效的字段】
  • ACK,除了三次握手的第一个SYN报文外其余都是1
  • PSH,接收方收到报文后,不应该等待缓冲区满,而直接向上传送数据
  • RST,发生错误,需要重置连接
  • SYN
  • FIN
  • 16位窗口大小
  • 16位CHECKSUM
  • 16位紧急指针
  • 额外选项

唯一确定一个TCP连接

四元组可以唯一确定一个连接

IP数据包头部中的源/目的IP地址(32位) + TCP数据包头部中的源/目的端口号(16位)

TCP、UDP区别

  • 可靠/不可靠
  • 面向连接的/不是面向连接的
  • 建立释放连接的时候
  • 基于字节流/基于数据包
  • 头部大小
  • 一对一/一对多
  • 【分片不同】【TCP是在TCP层分片,UDP是交给IP分片】

三次握手

client:closed, syn_sent, establised

syn, syn/ack, ack

server:closed, listing, syn_recv, established

为什么三次握手

  • 避免历史报文初始化连接产生混乱(principle purpose)
  • 同步双方序列号
  • 双方确认双方的收发能力正常
  • 避免资源的浪费

避免历史报文初始化连接产生混乱

  • 什么时候会历史syn可能初始化连接?

    • 发送多个syn时,老的syn被网络延迟
    • 启用某些参数跳过time_wait时,也有可能
  • 为什么三次握手能避免

    client在第三次握手的时候能够有足够的上下文来判断是不是历史连接,如果是可以RST报文终止,如果不是则正常开始第三次握手(第三次可以携带数据请求,前两次不行)

避免资源的浪费

如果两次握手就初始化连接的话,那么server在收到syn报文并且回复syn/ack报文的时候就会进入established的状态,这个时候延迟的syn可能再次初始化连接,也就是初始化了历史连接

同步双方序列号

序列号是实现可靠数据传输的关键,采用一发一收的形式可以确认自己和对方的序列号有没有同步

双方确认双方的收发能力正常

次数clientserver
1什么都不知道client发,server收
2client发,client收,server发,server收client发,server收
3client发,client收,server发,server收client发,client收,server发,server收

跳过三次握手 TCP Fast Open

请求 TCP Fast Open Cooki

  1. 客户端发送SYN数据包,该数据包包含Fast Open选项,且该选项的Cookie为空,这表明客户端请求Fast Open Cookie;
  2. 支持TCP Fast Open的服务器生成Cookie,并将其置于SYN-ACK数据包中的Fast Open选项以发回客户端;
  3. 客户端收到SYN-ACK后,缓存Fast Open选项中的Cookie。

实施TCP Fast Open

以下描述假定客戶端在此前的TCP連接中已完成請求Fast Open Cookie的過程並存有有效的Fast Open Cookie。

  1. 客户端发送SYN数据包,该数据包包含数据(对于非TFO的普通TCP握手过程,SYN数据包中不包含数据)以及此前记录的Cookie;
  2. 支持TCP Fast Open的服务器会对收到Cookie进行校验:如果Cookie有效,服务器将在SYN-ACK数据包中对SYN和数据进行确认(Acknowledgement),服务器随后将数据递送至相应的应用程序;否则,服务器将丢弃SYN数据包中包含的数据,且其随后发出的SYN-ACK数据包将仅确认(Acknowledgement)SYN的对应序列号;
  3. 如果服务器接受了SYN数据包中的数据,服务器可在握手完成之前发送数据;

ISN

initial synchronize number,初始序列号

  • 为什么不从0开始 / 为什么client和server的ISN不一样

    • 防止黑客攻击
    • 更有效防止异常情况
    • 因为随机开始的序列号可能根本就不在对方的接收窗口之内,对方即使接收了也不会产生将其视为有效
  • ISN生成方式

ISN = 时钟算法 + 以源/目的/主机号/端口号为参数的哈希函数

分片方式

  • UDP是交给IP分片,TCP是在传输层分片的

  • TCP在传输层分片的好处?

    • 因为TCP要实现可靠数据传输,所以重传等机制都是在传输层实现的
    • 如果交给IP分片,重传的是分片前的数据包,这些数据包很大
    • 如果是TCP分片,重传的是分片后的数据包,相对来说重传的数据较少
  • MSS,MTU

    • MSS,max segment size,传输层的最大长度

    • MTU,max transport unit,网络层的最大长度,以太网是1500byte

    • MSS = MTU - IP Header - TCP Header

SYN攻击