TCP协议详述

    TCP协议是面向连接的传输层协议。其相对于UDP而言,主要有三个特征:面向连接、可靠传输、面向字节流。

  • 面向连接。TCP协议规定双方通信之前需建立可靠的连接(三次握手),通信结束后需断开连接(四次分手)。由此可见,TCP协议也是一种一对一的通信协议,即不支持广播和多播。
  • 可靠传输。TCP协议规定发送端发送的每个报文段都要得到接收端的回复(ACK),除此之外,TCP还有超时重传,定时器等机制来确保每一份报文都安全到达接收方。
  • 面向字节流。面向字节流指的就是发送端执行的写操作次数和接收端执行的读操作次数之间无关,即TCP数据收发是无边界的。当应用程序执行写操作时,将这些数据放到TCP发送缓冲区,当真正发送数据的时候,就把发送缓冲区的数据封装成多个TCP报文段发出,接收方将收到的TCP报文段放入接收缓冲区,然后接收端的应用程序再将接收缓冲区的数据一次或者多次读出。因此TCP的接收端和发送端读写次数无关。

TCP头部结构

    TCP的头部结构分为固定头部结构和头部选项。TCP的固定头部为20字节,头部选项小于40字节,总头部大小最长为60字节。

  • 16位源端口号和16位目的端口号。主要是表示该报文段来源于哪个端口,以及要传输到目的的哪个端口(上层协议或应用程序)
  • 32位序号是一次TCP通信过程中某一个方向上的字节流的每个字节的编号
  • 32位确认号是另一方发送来的TCP报文段的响应,值为收到TCP报文段的最大字节+1
  • 4位首部长度表示该TCP首部有多少个4字节(32bit),所以最多是4*15=60字节
  • 标志位包括:URG:紧急指针时候有效(带外数据)。ACK(确认报文段):确认号是否有效。PSH:提示接收端应用程序应该立即从TCP接收缓冲区读走数据,为后续数据留出空间。RST(复位报文段):表示要求对方重新建立连接。SYN(同步报文段):表示请求建立一个连接。FIN(结束报文段):表示通知对方本端要关闭连接了。
  • 16位窗口大小:TCP流量控制的手段,指的是接收窗口的大小,用于告诉对方本端的TCP接收缓冲区还剩余多少容量
  • 16位检验和:用于CRC冗余码检验,保证可靠传输。
  • 16位紧急指针:当URG标志设定了才有效,用户发送端向接收端发送紧急数据。
  • 选项是可变长的可选信息,最多包含40字节。

       选项的kind说明选项类型,length指定选项总长度,info说明选项具体信息。

     kind=0是选项表结束选项

     kind=1是空操作选项

     kind=2是最大报文段长度选项(MSS)。TCP连接初始化时候,通信双方使用该选项来协商最大报文段长度MSS,一般为MTU(最大传输单元)-40(40字节包括20字节TCP头部和20字节IP头部),避免本机发生IP分片。

     kind=3是窗口扩大因子选项,用来协商接收窗口的大小,与MSS一样,只能出现在SYN同步报文段中。

     kind=4是选择性确认选项(SACK),TCP通信过程中,如果某个TCP报文丢失,SACK使TCP只重传丢失的报文段,不用发送所有未确认的报文段

     kind=5是SACK实际工作选项,该参数告诉发送端接收端已经收到并缓存的不连续数据块,从而让发送端可以据此检查并重发丢失的数据块。

     kind=8是时间戳选项。

TCP三次握手

(1)第一次握手:把标志位置为SYN,说明是一个同步报文段,任取一个数作为序号。作用是发起连接请求。

(2)第二次握手:也是同步报文段,同时还把确认报文标志置1,确认号为传来的报文序号+1,任取一个数作为本报文段的序号。作用是同意连接请求。

(3)第三次握手:是一个确认报文段,回传给发送者。作用是收到你同意连接请求的信息。

TCP四次分手

(1)第一次分手:标志为FIN,说明为一个结束报文段。作用是客户端要求关闭连接

(2)第二次分手:服务器回复一个确认报文段

(3)第三次分手:也为结束报文段。作用是服务器要求关闭连接

(4)第四次分手:客户端回复确认结束报文段

    一般而言,TCP连接请求由客户端发起。但是关闭请求有可能为客户端发起,也有可能是服务器发起的。在四次分手的过程中,当一方发送结束报文段的时候,意思是自己已经没有数据要发送了,但是可以接收对方发来的数据,直到对方也发送结束报文段,这一种状态就称为半关闭状态。

TCP状态转移

TIME_WAIT状态:指的就是客户端在接收到服务器发来的结束报文段后进入的状态,在TIME_WAIT状态,客户端要等待2MSL才能关闭(MSL是maximum segment lifetime的简称,即为任何IP数据报能够在因特网中存活的最长时间)

TIME_WAIT状态存在的原因:1.为了让最后的ACK报文段顺利到达服务器,即可靠地中止TCP连接。

                                                 2.保证让迟来的TCP报文段有足够的时间被识别并丢弃。

TIME_WAIT状态等待时间定为2MSL原因:也是为了确保网络上两个方向传输的TCP报文段已经被丢弃,迟到的TCP报文段消失。

对于客户端应用程序而言,一般不用考虑TIME_WAIT状态占用端口的问题,因为客户端一般使用系统临时分配的端口号建立连接。对于服务器而言,若主动断开连接后会存在TIME_WAIT状态。

TCP超时重传与拥塞控制

    超时重传:TCP服务必须能够重传超时时间内未收到确认的TCP报文段,因此,TCP协议为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送的时候启动,当超出时间未收到应答,TCP将重传TCP报文段并重置定时器。

    拥塞控制:主要分成四个部分:慢启动、拥塞避免、快速重传、快速恢复。拥塞控制最终受控的变量是发送端向网络一次连续写入的数据量,即为发送窗口(SWND),其是取SWND(接收窗口)和CWND(拥塞窗口)中的较小值。

    发送端判断拥塞发生一般有两个依据:1.传输超时或者TCP定时器溢出(采用慢启动,拥塞避免)

                                                                  2.接收到重复的确认报文段(采用快速重传和快速恢复)

    慢启动和拥塞避免:一开始以试探地方法增加CWND大小,CWND按照指数形式扩大(慢启动,慢启动其实一点都不慢),当到达慢启动门限时,则使CWND按照线性方式增加,从而减缓其扩大(拥塞避免)。当发生传输超时,一般门限值会下降一半,然后CWND会变为SMSS

                                                                ssthresh=max(FlightSize/2,s*SMSS)

                                                                CWMD<=SMSS

    快速重传和快速恢复:发送端如果收到3个重复地确认报文段,则确定拥塞发生。门限值还是下降一半,然后CWND=ssthresh +3*SMSS。

TCP应用程序数据

    TCP携带的应用程序数据,按照长度分为两种:交互数据和成块数据。交互数据仅包含很少字节,其对实时性要求高,如telnet,ssh等,成块数据长度通常为TCP报文段允许的最大数据长度,对传输效率要求高,如ftp。

Nagle算法

    该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组,该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组。

TCP连接中的种种异常

  to be continue,,,

 

参考:《TCP-IP详解卷1》、《Linux高性能服务器编程》、《UNP》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值