TCP协议是TCP/IP协议族中另一个重要的协议。和IP协议相比,TCP协议更靠近应用层,因此在应用程序中具有更强的可操作性。
TCP头部信息:
16位端口号:告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。
32位序号:一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号,
32位确认号:用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。
4位头部长度:标志该TCP头部有多少个32bit字。
16位窗口大小:是TCP流量控制的一个手段。
16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以校验TCP报文段在传输过程中是否损坏。
16位紧急指针:发送端向接收端发送紧急数据的方法。
三次握手与四次挥手:
TCP状态转移:TCP从建立到关闭的整个过程中通信两端状态的变化。
服务器通过listen系统调用进入LISTEN状态,被动等待客户端连接,因此执行的是所谓的被动打开。服务器一旦监听到某个连接请求,就将该连接放入内核等待队列中,并向客户端发送带SYN标志的确认报文段。此时该连接处于SYN_RCVD状态。如果服务器成功地接收到客户端发送回的确认报文段,则该连接转移到ESTSBLISHED状态。ESTABLISHED状态是连接双方能够进行双向数据传输的状态。
TIME_WAIT状态:在这个状态,客户端连接要等待一段长为2min的时间才能完全关闭, 出现在主动发起断开接连请求的一端。
意义:1、保证可靠的终止TCP连接。
2、保证迟来的数据报能被识别并丢弃。
TCP协议的可靠性:
1、32位序号保证数据有序。
2、32位确认号保证数据不会丢失(如果没有接收到数据有超时重传机制保障数据)
3、16位窗口大小保证接收端大小与发送端大小的流量匹配。
4、16位校验和保证数据/值完整性。
TCP超时重传:
在异常网络状况下(开始出现超时或丢包),TCP如何控制数据传输以保证其承诺的可靠服务?
TCP服务必须能够重传超时时间内为收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传策略。
TCP一共执行5次重传,每次重传超时时间都增加一倍,在5次重传均失败的情况下,底层的IP和ARP开始接管,直到telnet客户端放弃连接为止。
拥塞控制:TCP模块还有一个重要的任务,就是提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性,这就是所谓的拥塞控制。
拥塞控制的最终受控变量时发送端向网络一次连续写入的数据量,我们称为SWND(Send Window,发送窗口)。不过,发送端最终以TCP报文段来发送数据,所以SWND限定了发送端能连续发送的TCP报文段数量。这些TCP报文段的最大长度称为SMSS。
发送端需要合理地选择SWND的大小。如果SWND太小,会引起明显的网络延迟;反之,如果SWND太大,则容易导致网络拥塞。前文提到,接收方可通过其接受通告窗口(RWND)来控制发送端的SWND。但这显然不够,所以发送端引入了一个称为拥塞窗口(CWND)的状态变量。实际的SWND值是RWND和CWND中的较小者。
拥塞控制四部分:慢启动、拥塞避免、快速重传和快速恢复。