什么是TCP
TCP是位于IP上层的传输层协议,它提供一种面向连接的、可靠的字节流服务。
为什么说TCP是字节流服务?这是因为应用数据被分割成TCP认为最合适发送的数据块来传输。有可能这段应用数据太小,被存在TCP的缓存区,等累积到合适的大小再传输,还有可能这段数据被TCP分割成好几块来传输,从TCP的角度来看,它并不知道这块数据有什么意义,也不知道传输的数据是什么类型的数据。
下面是TCP报文的数据格式:
- 序号表示在这个报文段中的第一个数据字节
- 确认序号应当是上次已成功接收到数据字节序号加1。只有ACK标志为1时,确认序号字段才有效。
- 如果在发送过程中,发送方中间某一段报文丢失,接收方会连续发送对希望收到丢失报文的ack,发送三次就确定分组已经丢失。
- TCP流量控制由连接的每一端通过声明的窗口大小来提供,窗口大小为字节数,表示接收方可以接收对方发过来多少个字节的数据。
- URG置1的话,就表示出现了紧急数据。16位的紧急指针是一个正的偏移量,它与前面的序号字段相加,得到的是紧急数据中最后一个字节的序号,TCP只能知道紧急数据的最后一个字节在哪里,而紧急数据开始的地方应该由应用程序知道。紧急数据的作用是:如果一端通告了一个大小为0的窗口,也就是这一端不能再接收数据了,但是如果对端进入了紧急模式,TCP仍然会立即发送紧急指针和URG标志,上层的应用程序就会处理数据,打开窗口,使数据重新流动起来。
- 最常见的可选字段是最长报文大小,又称MSS。每个连接方都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指的是本端能接收到的最大报文段的长度。就是一次最多能发送多大长度的报文。有的可能会设为MTU-40bytes。如果不在一个局域网内,默认为536bytes。MSS让主机限制另一端发送数据包的长度,这样可以避免分段。
一般可以看作在三次握手的时候,两端分别告知自己的MSS,然后选择较小的MSS作为能够一次发送的最大的报文长度。