TCP的三次握手和四次挥手

TCP协议是在网络编程中常用到协议,通过三次握手建立起链接,并通过四次挥手断开链接,网络上有很多对于TCP的讲解,写这篇文章只是想给自己标记一下,让自己对TCP协议有一个初步的了解

TCP在网络系统中的位置

TCP的三次握手和四次挥手_第1张图片

  • 我们需要知道TCP(或者UDP)工作在网络OSI的七层模型中的第四层——Transport层,IP在第三层——Network层,ARP在第二层——Data Link层

建立连接和断开链接

需要知道的基础知识:
* Sequence Number:包的序号,用来解决网络包乱序(reordering)问题。
* Acknowledgement Number(ACK):用于确认收到,用来解决不丢包的问题。
* Synchronize Sequence Numbers:同步序列号,传输双方约定的一个序列号(就是下图中seq=x,里面的x,y)
* FIN :Client或者Server端想要断开链接的请求

TCP的三次握手和四次挥手_第2张图片

这是网络上的图片,拿过来用一下。网络上的传输是没有连接的,包括TCP也是一样的。而TCP所谓的“连接”,其实只不过是在通讯的双方维护一个“连接状态”,让它看上去好像有连接一样。

建立链接的3次握手

  • 第一次,初始化Sequence Number
    Client:
    Server!我想跟你建立个链接来传输数据(SYN seq=x—–[表明“当前这句话,在Client这里被标记为第 x 句”])

  • 第二次,Server应答Client中 seq=x;做好链接准备,并告知Client已经做好准备。
    Server :
    Client!我已经收到你得标号为x的请求(ACK=x+1)—[回复都是标记值+1];
    Client!我已经做好了链接的准备了(SYN seq=y—[当前这句话在Server这里被标记为y])

[在发送前因为Server在开始时,仅仅需要向Client传递信息“自己已经准备好了”,并没有其他需要传递的东西,所以以上两句就直接打包一起发送了]

  • 第三次,Client应答Server的seq=y 语句
    Client:Server!我已经知道你准备好了(ACK=y+1)

  • 之后就是传输数据了,两端每发送一次消息,对方都要用ACK应答一次

断开链接的4次挥手

  • 第一次,Client发送想要断开链接的请求
    Client :
    Server!我我已经准备好断开了,请求断开(FIN seq=x+2—[这里的标记还是按照Client端的标记排列下来的])
    我还要相应Server传给我的“SYN seq=y 这个语句”(ACK=y+1)

    合并发出去

  • 第二次,Server端应答Client的“FIN seq=x+2”
    Server:
    我已经收到你想要断开的请求了(ACK=x+3)

此时,Server开始处理自己遗留的没法送出去的信息,一般会比较耗时,只有当处理了所有自己未发出的消息后,Server才会想Client发送,请求断开的信息

  • 第三次,Server发送了所有的消息之后,同样也来请求断开。
    Server:
    Client! 我已经准备好断开了,请求断开(FIN seq=y+1)—-这个顺序还是按照普通的Server排序下来的

  • 第四次,Client端应答 “FIN seq =y+1”
    Client : Server!我已经收到你 请求断开的消息了

之后Client 端会等待 2*MSL 后,完成断开操作(这个时间和TCP的重传有关,先不介绍)


到这里我们的三次握手和四次挥手就说完了。

参考:
[0]http://coolshell.cn/articles/11564.html
[1]http://www.jellythink.com/archives/705

你可能感兴趣的:(网络基础)