TCP1

来源:互联网 发布:java如何调用数组 编辑:程序博客网 时间:2024/06/05 14:56

TCP提供了一种面向连接的(建立终止的过程),可靠的(每个字节要确认)字节流服务,类似需要经历一个“打电话”的过程,等到通信准备好后才发送数据,最后结束通话。UDP是把数据直接发出去,不管对方有没有收到,就算UDP数据报没有到达,也不会产生ICMP差错报文。

TCP通过以下方式提供可靠性:

       应用数据被分割成TCP认为最适合发送的数据块,不会超过1500字节,握手时协商最大传输单元MSS分隔应用程序给的数据,一般不会分片。

       当TCP发送一个段后他启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到这个确认,将重发这个报文段。

       当TCP收到发送端的数据,它将发送一个确认,通常推迟几分之一秒。

       TCP将保持他的首部和检验和,目的是监测数据在传输过程中的任何变化,如果收到段的检验和有差错,TCP将丢弃这个报文段。

       既然TCP报文段用作IP数据传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序,TCP将对收到的数据进行重新排序,以正常顺序交给应用层。

       IP数据报会发生重复,TCP接收端必须丢弃重复的数据。

       TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲区,TCP接收端只允许另一端发送接收缓冲区所能容纳的数据,防止较快的主机致使较慢主机缓冲区溢出。

       TCP保证可靠性的方式是超时重发,只要没得到确认,就一直重发数据报,直到对方确认为止。字节流服务接收方不知道发送方每次传输多少数据。

       TCP首部前四个字节分别为源端口和目的端口,最大65535,源IP目的IP源端口目的端口确定唯一一个TCP连接。后面为两个32位序列号,全双工双向都要确认,增加一个序列号表示成功传输一个字节,与成功传输字节数有关,确认序列号为接收方希望收到的下一个字节。然后四位首部长度(每位4字节位,24-1=15)。然后标志位ACK、SYN、FIN,(SYN,FIN)标识消耗一个序列号,16位窗口大小,TCP的流量控制由每端声明的窗口大小提供。16位检验和(TCP首部和数据)。

       TCP的建立和终止,TCP是一个面向连接的协议。无论哪方发送数据之前都需要建立一条连接,握手互通窗口大小限制双方,UDP不管连接直接发。

       TCP连接的建立,1.服务器必须准备好接收外来连接。通过调用socket,bind,listen三个函数完成,被动打开。2.客户通过调用connect发起主动打开,发送一个SYN分节,告诉服务器将在(待建立)连接中发送数据的初始序列号J。3. 服务器必须确认(ACK)客户的SYN,同时自己发送一个SYN ,含有服务器同一连接中发送数据的序列号k。4.客户发送ACK k+1确认服务器的SYN。每一个SYN的ACK确认号是该SYN的初始序列号加1.


TCP连接的终止,终止一个连接需要4个分节,1.客户端调用close(),发送一个FIN+ACK分节,2.接收到这个FIN的对端被动关闭,服务器回ACK,意味接收端应用进程在连接上无数据,3.一段时间后接收端调用close()关闭套接字,导致TCP给客户发送一个FIN,4.接收这个FIN的源端确认这个FIN。

最大报文长度

       在建立连接时,通信双方要确认对方的最大报文长度MSS。一般SYN长度是MTU减去固定IP和UDP首部的长度。对于一个以太网(本地MTU-40),一般为1460字节。当然如果对于非本地的IP(跨网),这个MSS可能就只有536(最小)字节,而且,如果中间的传输网络的MSS更佳的小的 话,这个值还会变得更小。TCP正常最大1460,一般MTU=1500,一般不会分片。

TCP半关闭

       半开:客户接收到SYN+ACK后没补ACK。在关闭连接,应用程序还有接收数据的能力但不能发送数据,还有一种可能客户端一直处于FIN_WAIT_2状态,而服务器一直处于WAIT_CLOSE状态,知道应用层关闭这个状态。



状态转移,通过netstat –an 查看端口状态

服务器状态转移:

       LISTEN->SYN收到->ESTABLISH->CLOSE_WAIT->LASK_ACK->CLOSED

客户端状态转移:

       SYN_SENT->ESTABLED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT(等待最后FIN).其他其他状态迁移

       SYN_SENT->SYN客户和服务端在此状态如果收到SYN,则要发送ACK并把自己调整到SYN收到状态,准备进入ESTABLED。

       SYN_SENT->CLOSED发送超时会返回到CLOSED状态。

       SYN_收到->LISTEN,如果收到RST包,则返回到LISTEN。

2MSL等待状态

       客户发送FIN进入FIN_WAIT_1,服务器收到FIN后进入CLOSE_WAIT,发送ACK,客户收到后进入FIN_WAIT_2,服务器主动关闭发送FIN进入LASK_ACK,客户收到FIN后进入TIME_WAIT,客户发送最后一个ACK服务器收到就CLOSE。客户发最后一个ACK后需要在进入TIME_WAIT并持续等待2MSL时间,在这段2MSL时间内以前TCP的插口对不能使用。MSL:一个分段在互联网最长的生存时间。

       原因1:最后ACK发送可能经过很长MSL时间,服务器未等到这个ACK会重发FIN,一去一回要等待2MSL,让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重传最后FIN)。2:如果在2MSL马上使用这个socket继续同服务器建立新的连接,但是以前的那个ACK又回来了,但是这个ACK是以前TCP连接部分与当前TCP无关,当前客户端收到会错误理解,所以要等待2MSL使新连接不受影响。


0 0