3) 、TCP报文格式以及连接对象半路丢失怎么办
• 源端口和目的端口:各占2字节,存储源端口号和目的端口
• 序号seq:占4字节,表示的范围就是整形的范围[0~2^32]。序号使用在给数据部分每个字节进行编号的,编号方式是mod 2^32 。
• 确认号ack:占4字节,范围也是无符号整数的范围。使用在对端传输给我的数据最后一个字节序号,例如A传输给B 101—500,此时B返回的确认号一定是小于等于501的。当B段正确接收数据之后才会返回确认号,换句话说确认号之前的数据已经全部接收。
• 数据偏移:占4bit,数据偏移很多人很容易想到是不是表示数据的长度,那就错了。偏移嘛,指的是TCP起始位置到数据部分的起始位置的偏移,也就是TCP首部的长度。
• 保留:占6bit,保留字段顾名思义,就是为今后使用,默认置为0。
• 紧急URG控制位:占用1bit,URG=1,表示紧急指针有效,此时tcp数据优先传输。相当于生活中的紧急通道,特殊情况时使用。在网络中也会有特殊情况,例如,发送一个很长的程序在远程服务器上运行,此时发现程序有bug,需要中断运行,因此我们从键盘输入Ctrl c,假如不使用紧急数据,需要在缓冲区里排队,都知道是bug了,还要排队,这怕是要出锅啊。此时使用紧急数据传输,不需要排队,直接中断程序是不是更符合我们的预期。需要注意一点是,即使窗口为0时,也可以发送紧急数据。
如何使用紧急URG控制位,在socket编程中send函数flag参数
send(int socket, const void *buffer, size_t length, int flags);
flags参数传MSG_OOB宏时,表示此时有紧急数据。MSG_OOB是个宏
• 确认ACK:占1bit,当ACK=1时生效。TCP有条硬性规定,当建立链接成功后所有传输的数据报文都必须把ACK置为1。
• 推送PSH:占1bit,发送方把PSH置为1时 会立即发送该数据包,接收方收到PSH=1的报文会立即处理交付给应用层处理。是不是感觉和URG很像,其实还是有些区别的。
//两者相同点:
URG与PSH两者都使用于紧急处理的情况,用来快速传输紧急数据。
//两者不同点
URG置为1时,对于发送发,“带外数据”与正常情况下应该发送的消息数据一起,封装成数据报发送,省去了在队列中等待的时间。
在接收方,解析报文后,获取数据之后还是要放在缓存区中,等待满了之后在向上往应用层交付。
PSH置为1时,对于发送方,表明这些数据不需要等向下发送的缓存区满,立刻封装成报文,发送,省去了等待发送缓存区到达满的状态的时间。
在接收方,也不需要等接受缓存区满,直接向上交付给应用层。
• 复位RST:占1bit,当RST=1时,TCP会主动释放链接,两种情况会用上。TCP出现严重差错时,会主动释放连接,重建链接,传输数据。遇到非法报文或者拒绝连接时会把RST置为1。
• 同步SYN:占1bit,同步控制位,用来在传输连接建立时同步传输连接序号。SYN=1时,表示这是一个连接请求或连接确认报文。SYN=1,ACK=0,表明这是一个连接请求数据段,如果对方同意建立连接,则对方会返回一个SYN=1、ACK=1的确认。
• FIN控制位:占1bit,用于释放一个传输连接。FIN=1时,表示数据已全部传输完成,发送端没有数据要传输了,要求释放当前连接,但是接收端仍然可以继续接收还没有接收完的数据。FIN=0,正常传输数据。
• 窗口大小:占16bit,2byte,用于表示发送方可以接受的最大数据大小。该窗口是动态变化的,用作流量控制时使用。
• 检验和:占16bit,2byte,用于对TCP头部,伪头部,数据三个部分进行校验。
• 紧急指针:占16bit,2byte,用于记录紧急数据的末尾在数据段中的位置。当URG=1时,该指针才生效。
• 可选项:可选项最长可达40byte,是可选的,可以没有。当可选项不存在时,TCP头部长度为20byte。可选项可以包括窗口缩放选项(Window ScaleOption,WSopt)、MSS(最大数据段大小)选项、SACK(选择性确认)选项、时间戳(Timestamp)选项等。
• 数据:TCP数据部分,由应用层应用程序提交的数据。