TCP首部(报头)理解

TCP作为网络模型中正数或者倒数的第4层,其实是一个协议,可以理解为操作系统的一个TCP进程,为数据传输提供稳定可靠的通道。一个TCP报文是由首部(报头)+数据组成,其中报头尤其重要。

TCP首部

TCP首部(报头)理解_第1张图片

图片来源与网络

一个TCP报文段的首部前面20个字节是固定的,而后面有4n个字节是根据需求而增加的选项(n为整数且最大为10),因此TCP报文段的首部最小长度是20个字节,最大长度是60个字节

  • 源端口和目的端口:各占2个字节(16bit),区分主机的不同进程

  • 序号:占4个字节(32bit),记录数据部分第1个字节的序号是多少

  • 确认号:占4个字节(32bit),期望收到对方下一个报文的第1个数据字节的序号。例如:B收到A的报文,序号是100,此时B要向A发送确认号101,意味着A下次要给B发送序号为101的报文

  • 4位首部长度:占4bit,也叫数据偏移,表示TCP报头的长度,由于TCP报头前20个字节都是固定的,但是可能会有4*10个字节是不固定的,所以TCP报头最大能到60个字节,这个字段就是用来精确记录TCP报头长度的

  • 保留:占6bit,保留为今后使用,但目前因置为0

  • 标志位:每一个标志占1bit,一共6bit。

    • URG:当这个标志置为1,说明此报文是紧急报文,需尽快传递
    • ACK:当这个标志置为1,上面的确认号字段才会生效,当3次握手结束时此标志置为1
    • PSH:较少使用
    • RST:当这个标志置为1,此时TCP连接发生严重错误
    • SYN:建立连接的同步序号,SYN=1,ACK=0,发送请求,对方同意后,则响应中SYN=1,ACK=1
    • FIN:释放连接,FIN=1,表示此次报文发送方发送的数据已经发送完毕,并要求释放TCP连接
  • 窗口:占2个字节(16bit),滑动窗口,流量控制问题

  • 检验和:占2个字节(16bit),如果接收的报文检验和有误,则丢弃此报文

  • 紧急指针:只有URG为1是有效,表示报文中紧急数据的字节数

  • 选项:长度可变,为4n个字节(n最大=10)

三次握手:

  1. 请求方(客户端)发送请求,将SYN置为1,假设seq=100,发送到接收方,一般来讲就是服务端
  2. 服务端接收请求报文,也将自己的SYN置为1,并且将ack=100+1,seq假设200,回传给请求方也就是客户端
  3. 客户端收到服务端报文,将ack置为200+1,并且发送给服务端

TCP是注重双向通信,面向连接的,上述第2步骤是将服务端的收发合并为一次进行。第2步发送到客户端是校验客户端的通信正常,第3部发送到服务端是让服务端知道自己的通信正常,所以一共是3次握手

四次挥手

任何一方主动发起都是可行的,假设客户端发起
图片来源网络

TCP首部(报头)理解_第2张图片

  1. 客户端发送报文,将FIN置为1,seq设置好,发送到服务端(FIN报文)
  2. 服务端收到该FIN报文,将seq设置好,ack+1发送给客户端(ACK报文)
  3. 服务端将FIN置为1,将seq设置好,ack+1,发送给客户端(FIN报文)
  4. 客户端收到FIN报文,将ack置为服务端seq+1,发送给服务端(ACK报文),服务端收到后立刻断开。等个2MSL后没收到回复,客户端也立刻断开,那么此次TCP连接就全部断开了

2MSL是最大报文生存时间,如果网络不可靠,有可能最后一个ACK丢失,所以会在这个时间内重发ACK报文

UPD

UDP是面向无连接,只管扔,收不收做强制,只要扔的多,可以保证收的也不少。

UDP只有两个字段,首部字段+数据字段。首部字段8个字节(64bit)由4个字段组成,每个占2个字节(16bit)

  • 源端口:需要接收方回应时才用,不需要可置为0
  • 目的端口:在终点交付报文时必须使用
  • 长度:UDP数据报文的长度,最小时8字节(64bit)
  • 检验和:检验报文传输过程中是否有误

你可能感兴趣的:(tcp/ip,网络,网络协议)