概念
TCP是一种面向连接的传输层协议,提供可靠的传输服务
TCP报文
-
源端口:发起端的随机端口
-
目的端口:如果是主机想要访问的是服务器,这里的端口号通常会主机想要连接的应用层服务有关
以下是常见的应用层协议端口
协议 端口号 FTP 21、20 HTTP 80 Telnet 23 SMTP 25 -
序号:发送数据包时往往会分片,序号用来区分不同的分片,接收端收到数据后进行排序
-
确认序列号:用来确认数据包是否收到(一般确认序列号是正好是 序号+1)
-
数据偏移:也就是头部长度,占4个字节,表示TCP报文段的数据距离TCP报文段的起始处有多远。
-
保留位:用于以后的扩用。如果后续TCP引入了一些新的功能,就可以使用保留位字段。 如果引入了保留位,那么对于TCP原来的报头结构的影响就是比较小的,方便各个TCP版本之间的兼容。
-
TCP报文段首部的6个控制位:URG、ACK、PSH、RST、SYN、FIN,只有0、1两种状态,默认都为0,需要用到时才置1;
- URG:紧急指针位,URG=1(置位)的时候,表明该数据是紧急数据,作为高优先级的数据优先传送,而不按原先的排队顺序传送。
- ACK:确认位,仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。(三次握手,四次挥手)
- PSH:当两个应用进程进行交互式的通信时,正常情况下接收端会等缓存区填满了再上传数据。但有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快的(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
- RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重复位。
- SYN:同步SYN(SYNchronization),在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。因此,SYN置1就表示这是一个连接请求或连接接受报文。(三次握手,四次挥手)
- FIN:用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
-
窗口:窗口大小(WIN,16位长),表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制,在传输过程中双方会不断动态调整。(滑动窗口)
-
校验和:(Checksum,16位长)对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。如果接收方检测到校验和有差错,则TCP段会被直接丢弃。
-
紧急指针:(16位长)—本报文段中的紧急数据的最后一个字节的序号。
-
选项字段:最多40字节。每个选项的开始是1字节的kind字段,说明选项的类型。
- 0:选项表结束(1字节)
- 1:无操作(1字节)用于选项字段之间的字边界对齐。
- 2:最大报文段长度(4字节,Maximum Segment
Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU(MTU最大长度为1518字节,最短为64字节),从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。 - 3:窗口扩大因子(3字节,wscale),取值0-14。用来把TCP的窗口的值左移的位数,使窗口值乘倍。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。
- 4:sackOK—发送端支持并同意使用SACK选项。
- 5:SACK实际工作的选项。
- 8:时间戳(10字节,TCP Timestamps Option,TSopt)
- 发送端的时间戳(Timestamp Value field,TSval,4字节)
- 时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)
TCP保证可靠性所采用的机制
TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。