TCP基础知识

TCP简介

TCP (Transmission Control Protocol 传输控制协议) , TCP 是工作于 OSI 模型传输层的协议 , 用来进行数据在网络中的传输。

维基百科 : 

在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

数据在TCP层称为Stream,数据分组称为分段(Segment)。作为比较,数据在IP层称为Datagram,数据分组称为分片(Fragment)。

TCP协议的运行可划分为三个阶段:连接创建(connection establishment)、数据传送(data transfer)和连接终止(connection termination)。操作系统将TCP连接抽象为套接字表示的本地端点(local end-point),作为编程接口给程序使用。在TCP连接的生命期内,本地端点要经历一系列的状态改变。

TCP 特性

  1. 面向连接 (connection-oriented)
  2. 可靠 (reliable)
  3. 字节流式 (byte-stream)
  4. 只支持单播传输
  5. 全双工传输 (full duplex)

TCP Head 

TCP 头中包含了很多信息 , 由发送方和接收方的信息结合组成。TCP 会根据 Head 中的信息对通信过程进行控制。要想学习 TCP 先要学习 TCP Head ,不然会不知所云。

              

OSI 模型中数据是一层层封装、解封装的 , TCP 数据会在网络层封装后得到上面图中的数据格式。没有 options 的时候 TCP Head 大小为 20 字节。

扫描二维码关注公众号,回复: 105569 查看本文章

              

Header Length  :  Head 的大小 , 用 4 bit 表示 , 4 bit 的最大值为 15 , 单位是 32-bit , 所以 20 byte ≤ Header Length ≤ 60 byte 。

Source Port  : 数据发送方发送数据所使用的端口。

Destination Port  :  数据接收方用来接收数据所使用的端口。

Sequence Number (SN)  :  发送的 segment 的序列号, TCP连接建立时会产生一个随机的初始序列号 (ISN)。假设 ISN = 300 , 本次发送的 segment 中数据大小为 30 byte ,  SN 就是 330 。

Acknowledgment Number  :  接收方确认接收到一个 segment 的应答序列号。假设发送方发送的 segment SN = 330 , 接收方接收到的除了头信息外的数据载荷 data payload = 30 byte , ACK Number 为 SN + data payload = 360  。

Reserved  :  保留位,为了以后扩展 。

TCP  Flags (每一位占 1 bit)

    CWR  (Congestion Window Reduce)  :   发送端缩小拥塞窗口标志,用来通知接收端它已经收到了设置ECE标志的ACK。

    ECE (ECN (Explicit Congestion Notification 显示拥塞通知) Echo) :   ECE 在TCP三次握手时表明TCP端是否支持ECN;在传输数据时表明接收到的TCP段的IP首部的ECN被设置为11,即接收端发现了拥塞。

    URG (Urgent) :    表示 TCP Head 中的 "Urgent Pointer" 有效 。

    ACK (Acknowledgment) :  表示 TCP Head 中 "Acknowledgment Number"  是否有效 , 有效说明这个 TCP segment 是确认的数据包。0  - 无效 , 1 - 有效 ;

    PSH (PUSH) :   发送端 PSH = 1 , 表示发送端缓存中已经没有待发送的数据,接收端不要将该数据进行队列处理,尽快的将数据传输给应用进程处理。

    RST (Reset) :  RST=1 ,表示TCP连接中出现严重差错,必须释放连接,再重新建立连接。

    SYN (Synchronize) :    TCP建立连接时同步序列号, SYN = 1 , ACK = 0 , 是表示请求建立连接的 segment 。  SYN = 1 , ACK = 1 , 是表示同意建立连接的 segment 。 

    FIN (Finish) :   FIN = 1 ,表示发送端数据发送完毕 , 要求释放连接。

Window Size  :    接收端接收数据的窗口大小,用于流量控制 。这个接收窗口可以让发送端知道接收端还可以接收多少数据, 发送方会根据接收方窗口的大小来决定发送多少数据。当 window size = 0 时 , 发送方必须要等接收方的缓冲区有空间了之后才发送数据。

Checksum   :   发送端基于 TCP Head & Data 的和再求反码 , 接收端会根据接收到的 segment 去计算这个值, 如果计算得到的结果和 segment 中 Checksum 的值不一致就直接丢弃这个 segment 。(注意:TCP校验和也包括了96位的伪头部,其中有源地址、目的地址、协议以及TCP的长度。这可以避免报文被错误地路由。) TCP的校验和是一个比较脆弱的校验。

Urgent Pointer  :   指向 Data 中的优先部分 ,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。在 URG = 1 时有效。

Options :  TCP首部可以有多达40 byte 的可选信息,每个选项的开始是1字节的kind字段,说明选项的类型。

  • 0:选项表结束(1 byte)
  • 1:无操作(1 byte)用于选项字段之间的字边界对齐。
  • 2:最大报文段长度(4 byte,Maximum Segment Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)byte,携带TCP报文段的IP数据报的长度就不会超过MTU,从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。
  • 3:窗口扩大因子(4 byte,wscale),取值0-14。用来把TCP的窗口的值左移的位数,使窗口值乘倍。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535 byte。
  • 4:sackOK—发送端支持并同意使用SACK选项。
  • 5:SACK实际工作的选项。
  • 8:时间戳(10 byte,TCP Timestamps Option,TSopt)
    • 发送端的时间戳(Timestamp Value field,TSval,4 byte)
    • 时间戳回显应答(Timestamp Echo Reply field,TSecr,4 byte)

猜你喜欢

转载自my.oschina.net/j4love/blog/1806199