首页 > 代码库 > tcp协议详解

tcp协议详解

rst原因

 

在TCP协议中RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。

 其实在网络编程过程中,各种RST错误其实是比较难排查和找到原因的。下面我列出几种会出现RST的情况

1.端口未开放

服务器程序端口未打开而客户端来连接。这种情况是最为常见和好理解的一种了

2.请求超时

服务器回复syn时间,客户端认为超时,发送rst

技术分享

3.提前关闭

    关于TCP,我想我们在教科书里都读到过一句话,‘TCP是一种可靠的连接‘。 而这可靠有这样一种含义,那就是操作系统接收到的来自TCP连接中的每一个字节,我都会让应用程序接收到。如果应用程序不接收怎么办?你猜对了,RST。

4在一个已经关闭的socket(套接字)上收到数据

如果某个socket已经关闭,但依然收到数据也会产生RST。

如下图:

技术分享

 

tcp out of order

 

多半是网络用塞导致,导致顺序包抵达时间不同,延时太长,或者包丢失

另一个可能是因为 Client 到 Server 间有两条网路路径,像是 Load Balance 之类的架构,因此若两个封包走不同路径,晚送的封包却比早送的到达,就会发生 Out-Of-Order

 

 

tcp segment of a reassembled PDU

       在连个连接建立的时候,SYN包里面会把彼此TCP最大的报文段长度(MSS字段),在局域网内一般都是1460.如果发送的包比最大的报文段长度长的话就要分片了,被分片出来的包,就会被标记了“TCP segment of a reassembled PDU”,,看一下,被标记了的包的SEQ和ACK都和原来的包一致.

 

Tcp previous segment lost

 

它告诉发送方数据段丢失

 

Tcp dup ack(tcp重复应答)

    TCP  Dup  ACK XXXX#X 则代表了数据段丢失TCP状态,XXXX代表数据丢失的位置,#后代表第几次丢失;而TCP Retransmission则代表重发丢失数据。

 

 

 

 

 Tcpacked lost segment(tcp应答丢失)

 

 TCP Window Updat

      是TCP通信中的一个状态,它可以发生的原因有很多,但最终归结于发送者传输数据的速度比接收者读取的数据还快,这使得接受端的在缓冲区必须释放一部分空间来装发送过来的数据,然后向发送者发送Windows Update,告诉给发送者应该以多大的速度发送数据,从而使得数据传输与接受恢复正常

 

 

 

 

TCP状态转移要点

    TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得 注意的状态有两个:CLOSE_WAIT和TIME_WAIT。

 

1、LISTENING状态

FTP服务启动后首先处于侦听(LISTENING)状态。

2、ESTABLISHED状态

ESTABLISHED的意思是建立连接。表示两台机器正在通信。

3、CLOSE_WAIT

    对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭

4、TIME_WAIT

    我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分 段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情 况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。

    目前有一种避免TIME_WAIT资源浪费的方法,就是关闭socket的LINGER选项。但这种做法是TCP协议不推荐使用的,在某些情况下这个操作可能会带来错误。

 

tcp协议详解