网络

TCP报文

1
TCP头部重要字段
  • Sequence number 此序号保证了TCP传输的报文都是有序的,对端可以通过序号顺序拼接报文
  • Acknowledgement Number 此序号标识数据接收期望接收的下一个字节的编号是多少,同时也标识上一个序号的数据已经收到
  • Window Size 窗口大小,标识还能接收多少字节的数据,用于流量控制
  • 标识符
    • RUG=1 该字段表示 数据部分包含紧急信息,是一个高优先级数据报文
    • ACK=1 该字段 在TCP建立后传送的所有报文必须把ACK设置为1
    • PSH=1 表示接收端应该理解将数据push给应用层
    • RST=1 表示TCP连接出现严重的问题,可能需要重新建立TCP连接
    • SYN=1 SYN=1andACK=0表示当前报文段是一个连接的请求报文,SYN=1andACK=1表示当前报文是一个统一建立连接的应答报文
    • FIN=1 表示此此表文是一个释放连接的请求报文

TCP建立连接三次握手

  • 不管是客户端还是服务端,TCP连接建立后都能发送数据和接收数据,所以TCP是一个全双工协议
  • 期初两端都是closed状态,通信开始,双方都会创建TCB。服务器创建完TCB都进入LISTEN状态,等待客户端发送数据

第一次握手
客户端向服务端发送连接请求 SYN=1 报文段,该报文中包含自身的数据通讯初始序号,请求发送后,客户端进入 SYN-SENT 状态

第二次次握手
服务端接受到 SYN=1 报文段,如果同意连接,则会发送一个 SYN=1 and ACK=1 的应答,包含自身的数据通信初始序号,发送完进入 SYN-RECEIVED 状态

第三次次握手

  • 当客户端收到SYN=1 and ACK=1的同意连接的应答后,还要向服务端发送一个确认ACK=1 的确认报文,客户端发问后进入ESTABLISHED 状态。服务端接受这个应答后也进入 ESTABLISHED 状态,此时连接成功。

TCP为何建立连接需要三次握手,明明两次就可以

  • 背景,在建立连接中,任意一段掉线,TCP都会重复SYN包,一般会重试5次。TCP有超时重传机制
  • 主要为了防止出现失效的连接请求报文文段被服务端接受的情况,从而产生错误
  • 可以想象如下场景。客户端发送了一个连接请求 A,但是因为网络原因造成了超时,这时 TCP 会启动超时重传的机制再次发送一个连接请求 B。此时请求顺利到达服务端,服务端应答完就建立了请求,然后接收数据后释放了连接。
  • 假设这时候连接请求 A 在两端关闭后终于抵达了服务端,那么此时服务端会认为客户端又需要建立 TCP 连接,二次握手的情况下,服务端应答了该请求并进入 ESTABLISHED 状态。但是客户端其实是 CLOSED 的状态,那么就会导致服务端一直等待,造成资源的浪费。

TCP断开四次握手

UDP

特性:

  1. 面向无连接

    • 不需要向TCP 一样三次握手,想发数据就可以发
    • 不会对数据报文进行任何拆分和拼接操作
    • 发送端:应用层将数据传递给传输层的UDP协议,只会给数据增加一个UDP 头标识一下是 UDP 协议,然后就传递给网络层了 在接收端:网络层将数据传递给传输层,UDP 只取出IP报文头就传递给应用层,不会做任何拼接操作
  2. 不可靠性

    • 体现在无连接上,通信不需要建立连接,想发就发,不可靠
    • 收到什么数据就传递什么数据,不会备份数据,发送数据也不关心对方是否已经接收到数据了
    • 不判断网络环境,UDP 无阻塞控制,一直以恒定速度发送数据,不会对发送速率进行调整。弊端是网络条件不好的情况下可能会导致丢包。 对实时性要求高的场景就需要使用UDP而不是TCP
  3. 高效

    • UDP 头部开销小,只有8个字节,TCP二十个字节
    • 不可靠,不复杂,需要保证数据不丢失有序到达
    • 两个十六位的端口号,Source port分别为源端口,Destination port目标端口 length整个数据报文的长度
    • checksum整个数据报文的检测,用于发现头部信息和数据中的错误
  4. 传输方式
    UDP 支持一对一,一对多,多对多,多对一,提供单播,多播,广播的功能
  5. 适合应用场景
    实时性要求高的场景,直播,游戏,视频会议

##TCP UDP区别

  • 不需要向TCP 一样三次握手,想发数据就可以发
  • TCP 建立连接断开连接都需要先进行握手,TCP 传输数据过程中,通过各种算法保证数据可靠性。没有UDP高效