TCP协议1

TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用在彼此交换数据之前必须建立一个TCP连接。通过以下方式提供可靠性:

  • 应用数据被分割成TCP认为最适合发送的数据块。TCP传给IP的信息单元称为报文段。
  • TCP发送一个段后,会启动一个计时器,等待目的地确认收到这个报文段。如果不能及时收到一个确认(ACK),将重发这个报文段。
  • 当TCP收到另一端发来的数据,将发送一个ACK。不是立即发送的,通常将推迟几分之一秒,以便将ACK和数据一起发送(数据捎带ACK)。
  • 计算校验和。若收到的报文段的校验和有差错,TCP将丢弃这个报文段,并不确认收到。(期待超时重发)
  • TCP报文段封装在IP数据报中传输,IP数据报到达是不能保证顺序的,因此TCP报文段的顺序也不能被保证。如有必要,TCP应对收到的数据重新排序再交给应用层。
  • IP数据报可能会发生重复,TCP的接收端必须丢弃重复的数据。
  • TCP还能提供流量控制。TCP的接收端只允许对方发送自己缓冲区所能接纳的数据。

字节流服务指双方通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。另外,TCP对字节流的内容不作任何解释,它并不知道传输的字节流是二进制数据还是ASCII字符或是其它类型,这应由双方的应用层解释。


TCP首部

81587372507_.pic.jpg

  • 端口号用于识别发送端和接收端的应用程序。<源IP、目的IP、源端口、目的端口>可以唯一确认一个TCP连接。
  • 序列号,TCP是面向字节流的,需要追踪每个字节是否被成功送达,序列号表示这个报文段中的第一个数据字节。假设建立TCP连接时发送一个syns包,以0标记syns包中第一个字节数据(实际出于安全考虑可能会从一个随机数开始)。
  • 确认序列号,接收方下一次想要接受字节数据的序列号,通常是上次确认接收的字节数据的序列号+1。
  • 首部长度,指明TCP头部长度,分清数据和首部界线。前5行是必须使用的,占20字节。选项字段可以达到40字节。所以首部长度范围在 [20 bytes ~ 60 bytes]。如,首部长度是0101,则 5*4bytes = 20bytes。
  • URG置1表示紧急指针有效,紧急数据需要被优先处理,接收方通过单独通道转发紧急数据。
  • ACK置1表示TCP首部的确认序列号有效。除了在请求建立连接时发送的报文段,其它的TCP报文段都将ACK置1。
  • PSH置1时,接收方立即将数据发送给接收方的应用程序。(数据是有序的)
  • RST置1时表示重建连接,只有当遇到不可恢复错误或者不能正常终止连接时使用。(可能会造成输出中的数据丢失)
  • SYN置1时,接收方接收的TCP段中的序列号是初始化的序列号。三次握手建立连接时的请求TCP段中SYN置1。
  • FIN置1时,向接收方指明,发送方想终止连接。
  • 窗口大小(字节数),它表明了发送方的接收窗口大小,通告对方可以接受的数据大小。窗口大小在数据传输中会动态改变的,当检测到拥塞时,调小窗口大小以避免分组丢失。
  • 检验和,覆盖整个TCP段,计算类似UDP,也使用一个伪首部。
  • 紧急指针是一个正的偏移量,只有当URG位置1时该字段才被考虑。它指明从第一个字节数据开始有多少数据是紧急的。
  • 选项字段可用于:
    • 时间戳,接收端可能收到多个具有相同序列号的TCP报文段,通过时间戳确认正确的报文段。
    • 窗口扩展,将选项字段作为窗口使用扩展原本的16bit限制。
    • 参数协商,如建立连接时双方需要指明最大报文段大小。
    • 填充,当首部长度不是4字节倍数时可能需要填充一些伪数据0。如30bytes可能需要填充2bytes的伪数据。

参考

[1] TCP/IP详解卷1

results matching ""

    No results matching ""