TCP报文段的首部格式
TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段,一个TCP报文段分为首部和数据两部分,TCP的全部功能体现在首部各字段作用。
TCP报文段的前20个字节是固定的,后面有4n个字节根据需要而增加的选项(n为整数)。所以TCP首部最小长度为20字节。
首部固定字段意义如下:
1.源端口和目的端口:各占两个字节,分别写入源端口号和目的端口号。
2.序号:占4字节,序号范围是[0,2^32-1]一共是4294967296个序号,当序号用完以后,下一个序号就又回到0.在TCP连接中所有字节按序号编号首部中的字段序号标记本报文段所发送的第一个字节的序号。例如本报文段序号为201,携带有100字节的数据,那么最后一个字节数据为300,并且下个报文段数据应当从301开始发送。
3.确认号:占4个字节 ,是期望收到对方下一个报文段的第一个字节序号,一般由接收方发给发送方的确认报文中将确认号改为期望收到的数据字节编号,总之若确认号为N,则表示N-1之前的数据都已经正确的接接收了。
4.数据偏移:占4位,表示数据到TCP数据包头部的长度,其实就是表明TCP头部的长度,因为TCP头部固定20字节加上不确定的部分,但4位2进制能最大表示十进制数15,但应注意数据偏移的单位是32位字所以数据偏移最大能表示60字节,因此TCP首部最大为60字节,即选项长度不能超过40字节。
5.保留:占6位,作为以后使用,目前应该置0
6.六个控制位:
1)紧急URG:当URG置为1时表示此报文段为紧急报文,应当尽快送达,拥有较高的优先级,不需要排队传送。发送方会把经济数据插入到本报文数据的最前面发送,需要注意的是需要和紧急指针配合使用。
2)确认ACK:当ACK=1时,确认号才有效,当连接建立时,所有报文段ACK都必须置为1.
3)推送PSH:当两个应用交互式通信,有一段应用可能需要对方应用及时的响应,这种情况下可以将PSH位置为1,表示收到消息不用等待缓存区满才向上交付,而是尽快直接交付。
4)复位RST: 当RST置为1,表示TCP连接出现严重错误,需要断开并重新建立连接。
5)同步SYN:在建立连接用来同步序号,当SYN=1,ACK等于0,标指这是一个请求连接的报文段,如果对方同意连接就将SYN=1,ACK=1。
6)终止FIN:用来释放一个连接,当FIN置为1表示已经没有数据发送,已经发送完毕。并要求释放连接。
7.窗口:占2字节窗口值是[0-2^16-1]之间的整数,窗口告诉发送方从本报文段首部的确认号算起还能接受的数据量,而此窗口值作为发送端设置发送端口的依据。
8.检验和:占2个字节,用来检验首部和数据这两部分是否出现差错。
9.紧急指针:占2个字节,紧急指针只有在标志位URG=1时候才有用,它指出紧急数据的字节数,因为紧急数据后面就是普通数据,紧急指针给出了紧急数据在报文段末尾的位置。
10.选项:长度可变,最大40字节,如果不使用选项,TCP首部大小就为20字节。TCP最开始就只规定了一种选项就是MSS最大报文段长度,但MSS的意思是每个报文中数据字段的最大长度(即报文长度减去TCP首部长度),MSS默认长度位536字节,因此在所有计算机上都能支持的报文段长度为536+20=556字节.随着英特网的发展后来又增加了几个选项:窗口扩大、时间戳等。