TCP

来源:互联网 发布:matlab从文件读取数据 编辑:程序博客网 时间:2024/06/05 18:45

TCP和UDP的区别:

一、TCP提供面向连接的、可靠的、有确认的数据流传输,UDP提供非面向连接的、不可靠的、无确认的数据报传输。

二、对系统资源的要求来说,TCP较多,UDP较少。

三、TCP保证数据的顺序和正确性,UDP不保证数据的顺序,还可能丢包。

四、TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的交互通信。

五、TCP的逻辑通信信道是全双工的可靠信道,UDP是不可靠信道。



TCP三次握手和四次挥手:

三次握手:

第一次握手:客户端client发送SYN包(syn = x)到服务器server,并进入SYN_SEND状态,等待server确认;

第二次握手:服务器server收到client的SYN包(syn = x),确认client的SYN即发送ACK(ack = x + 1),同时自己发送一个SYN包(syn = y),即发送SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端client收到server的SYN+ACK包,向server发送确认包ACK(ack = y + 1),发送完毕,client和server进入ESTABLISHED状态,完成三次握手。


在握手过程中传送的包里不包含数据,三次握手完毕后,客户端和服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接会一直保持下去。


四次挥手:

第一次挥手:主动关闭方发送一个FIN,用来关闭主动放到被动方的数据传送,也就是主动关闭方告诉被动关闭方:我不会再给你发送数据了(在FIN包之前发送出去的数据,如果没有和搜到对应的ACK确认报文,主动关闭方依然会重发这些数据),但是此时主动关闭方还可以接受数据。

第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。

第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。


由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。 
简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例:
1.服务器读通道关闭
2.客户机写通道关闭
3.客户机读通道关闭
4.服务器写通道关闭
关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方的数据通信完全结束,过程中每次接收都需要返回确认数据段ACK。
详细过程:
    第一阶段   客户机发送完数据之后,向服务器发送一个FIN数据段,序列号为i;
    1.服务器收到FIN(i)后,返回确认段ACK,序列号为i+1,关闭服务器读通道;
    2.客户机收到ACK(i+1)后,关闭客户机写通道;
   (此时,客户机仍能通过读通道读取服务器的数据,服务器仍能通过写通道写数据)
    第二阶段 服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j;
    3.客户机收到FIN(j)后,返回确认段ACK,序列号为j+1,关闭客户机读通道;
    4.服务器收到ACK(j+1)后,关闭服务器写通道。
这是标准的TCP关闭两个阶段,服务器和客户机都可以发起关闭,完全对称。
FIN标识是通过发送最后一块数据时设置的,标准的例子中,服务器还在发送数据,所以要等到发送完的时候,设置FIN(此时可称为TCP连接处于半关闭状态,因为数据仍可从被动关闭一方向主动关闭方传送)。如果在服务器收到FIN(i)时,已经没有数据需要发送,可以在返回ACK(i+1)的时候就设置FIN(j)标识,这样就相当于可以合并第二步和第三步。


原创粉丝点击