linux网络编程(三)TCP传输控制协议
传输控制协议(Transmission Control Protocol),简称TCP协议, 它在原有IP协议的 基础上,增加了确认重发、滑动窗口和复用/解复用等机制,提供一种可靠的、面向连接的 字节流服务。
1. TCP的特点
- 字节流的服务:使用TCP协议进行传输的应用程序之间传输的数据可视为无结构的字节流,基于字节流的服务没有字节序问题的困扰。
- 面向连接的服务:在数据进行传输之前,TCP协议需要先建立连接,之后的TCP报文在此连接的基础上传输。
- 可靠传输服务:基于校验和应答重发机制保证传输的可靠性。接收方对接收到的报文进行校验和计算,如果有误,不发送确认应答,发送方在超时后会自动重发此报文。
- 缓冲传输:缓冲传输可以延迟传送应用层的数据,允许将应用程序需要传送的数据积攒到一定的数量才进行集中发送。
- 全双工传输:各主机TCP协议以全双工的方式进行数据流交换。
- 流量控制:TCP协议的滑动窗口机制,支持主机间的端到端的流量控制。
2. TCP的数据格式
TCP在IP协议的基础上进行传输数据,TCP数据在IP报文中的位置,如图5.14所示。
TCP数据包含头部和数据两部分,其数据格式如图5.15所示。主要有源端口号、 目的端口号、 序列号、 确认号、 头部长度、 控制位、 窗口尺寸、TCP校验和、 紧急指针和选项等字段。
- 源端口号和目的端口号:这两个字段均为16位的长度,表示发送端和接收端的端口,用于确认发送端和接收端的应用程序。发送端的IP地址和端口号及接收端的IP地址和端口号可以确认一个在Internet上的TCP连接。
- 口序列号:序列号是一个32位长度的字段,表示分配给TCP包的编号。序列号用来标识应用程序从TCP的发送端到接收端发送的字节流。当TCP开始连接的时候,发送个一序列号给接收端, 连接成功后,这个序列号作为初始序列号ISN (Initial Sequence Number)。 建立连接成功后发送的第一个字节的序列号为ISN+l,之后发送数据ISN将按照字节的大小进行递增。序列号是一个32位的无符号数,到达2的32次方减1之后从0开始。
- 确认号:发送方对发送的首字节进行了编号,当接收方成功接收后,发送回接收成功的序列号加1表示确认,发送方再次发送的时候从确认号开始。
- 头部长度:表示TCP头部的长度,由于TCP的数据有可选字段,头部长度用于表示头部的长度。此字段的长度为4位,表示的是32位字长的数据。因此TCP的头部最长为60个字节,如果没有可选字段通常为20 字节。
- 保留位:6位长度没有使用,必须设为0。
- 控制位:6b,用做控制位,可以多个位一起设置,含义在表5.4中进行说明。
- 口窗口尺寸:窗口尺寸也称接收窗口大小,表示本机上TCP协议可以接收的以字节为单位的数目,本字段为16b大小。
- 校验和:16b。用于校验TCP传输数据的正误,包括TCP头和所有数据,TCP的数据必须强制校验。
- 紧急指针:16b。只有设置了URG位才有效,它指出了紧接紧急数据的字节的顺序编号。
- 边项:经常使用的为最大分段长度MSS (Maximum Segment Size)。TCP连接通常在第一个通信的报文中指明这个选项,它指明当前主机所能接收的最大报文长度。
3.建立连接的三次握手
主机A和主机B要使用TCP协议进行通信,需要先建立一条TCP连接,如图5.16所示。 为了建立一条TCP的连接,主机A和B需要进行三次通信过程(通常称为"三次握手",three way handshake)。
- 主机A发送一个SYN段到主机B告诉B想要连接的主机端口,以及初始的序列号(ISN,这里为1234567890)。
- 主机B应答,其中SYN段为主机B的初始序列号(ISN,这里为987654321),ack 段为主机A发送的ISN+l,即12345678910
- 主机A将主机B发送的SYN段+1作为确认号返回给主机B作为应答。
上面3个步骤完成了TCP连接的建立,连接建立之后,主机A和主机B之间可以进行TCP的数据接收和发送操作了。
4.释放连接的四次握手
建立一个 TCP 连接需要 3次握手,而终止一个 TCP 连接则需要4次握手。 如图5.17所示一个个主机 A 主动发起的与主机B终止 TCP 连接的过程。
- 主机A的 TCP 协议核发送FIN字段,序列号为1234567891的释放连接请求。
- 主机B先确认主机A的FIN请求,确认号为1234567892,在主机A序列号上加1。
- 主机B发送FIN请求。
- 主机A对主机B的FIN请求确认。
5.TCP的封装/解封包过程
图5.18所示为使用 TCP 协议的应用程序的数据传输过程, 用户数据由主机A 发送给主机B,数据封装在 TCP 的数据部分。
发送的过程是一个封包的过程。 在主机 A 上,在传输层, 用户发送的数据增加TCP头部,用户数据封装在 TCP 的数据部分。 在IP层增加IP的头部数据,TCP 的数据和头部都封装在IP层的数据部分。IP层将数据传输给网络设备的驱动程序,以太网增加头部和尾部后,发送到以太网上。
接收数据的过程是一个解封包的过程。在主机B上,驱动程序从以太网上接收到数据,然后将数据去除头部和尾部并进行CRC校验后,将正确的数据传递给IP层。IP层剥去IP的头,进行校验,将数据发送给其上层TCP层。TCP则将TCP的包头剥去,根据应用程序的标识符判断是否发送给此应用程序。在主机B上的应用程序会得到干净的有效数据,然后进行处理。
浙公网安备 33010602011771号