TCP是面向连接的传输层协议
特点:
  • 由于其面向连接的特性,传输数据之前必须先建立连接,数据传输完成需要释放连接
  • 每个连接只能有两个端点,即点对点传输
  • 端点:即套接字,有点分十进制的ip和端口号构成
  • 如:192.168.1.101:8080
  • 同一ip地址可以有多个tcp连接,同一端口号也可以出现在多个tcp连接中
  • Tcp是传输可靠的,可以保证数据的完整性
  • Tcp是全双工通信,通信两端的应用程序可以在任意时刻向对方发送数据,连接两端设有发送缓存和接收缓存,用于临时存放发送和接受的数据。应用程序发送的数据会被写入发送方的发送缓存,tcp会在合适的时机在通过报文发送,同理,当接收到对方数据不会立刻交付给应用,而是存在接收缓存区,当应用需要时再从缓存区读取
  • tcp面向字节流

每个连接事件可以发送4个数据包 IOS 连续发送两个tcp报文段_缓存

Tcp报文

先看一下报文的结构图

每个连接事件可以发送4个数据包 IOS 连续发送两个tcp报文段_端口号_02

  • 源端口与目的端口:发送方端口号和接收方端口号
  • 序号:即数据中每个字节在流中的编号,起始编号必须在连接创建时指定,每个报文段的序号表示该报文段第一个字节的数据在流中的对应编号
  • 确认号表示期望下次收到对方报文时该报文所携带数据的第一个字节的序号
  • 如果确认号为n,则表示已经正确收到对方序号到n-1为止的所有数据
  • 数据偏移:记录的时报文段的首部长度,只占4位,最大表示15,但单位是以4字节的长度为单位,所以最大值为60,这也解释了为啥报文首部最大60字节,选项最大40字节
  • 保留:为未来预留的6位空间,暂无意义
  • 接下来是6个控制位,各占一位
  • URG:当URG=1,表示后面的紧急指针有效。
  • urg=1,表示有紧急数据要传送,会把数据插入到数据的最前面作为紧急数据(相当于高优先级),其后仍为普通数据
  • ACK:如果要让前面提到的确认号有效,那么ACK必须等于1,当建立连接后,传输的报文都必须把ACK置为1
  • PSH:即推送,用的较少,当psh=1时,接收到此类报文的接收方会尽快交付(推送)给应用程序,不用放入接收缓存
  • RST:当rst=1,表示传输出现严重错误,需要释放连接并重新建立连接传输。
  • SYN:在建立连接时同步序号用的当syn=1,表示本报文是一个连接创建请求报文(syn=1,ACK=0)或者接收连接创建的确认报文(syn=1,ACK=1)
  • FIN:当fin=1,表明此报文的发送方已经发送全部数据并请求释放连接。
  • 窗口:指此报文发送方的接收窗口,窗口值(经常动态变化)告诉接收方从本报文的确认号起,允许对方发送的数据量(单位:字节),因为缓存空间有限
  • 校验和:检查报文数据是否有错,有错则丢弃。计算检验和时会在报文段前加12字节的伪首部(不会被传输)
  • 紧急指针:当urg=1时才有作用,它指向了紧急数据的末尾在报文数据中的位置,指明了紧急数据与非紧急数据的边界
  • 选项与填充:长度可变,最大40字节,用于携带其他可选字段;填充仅仅是为了把整个报文凑为4字节整数倍