TCP三次握手,四次断开

之前面试的过程中,总是因为一些基础知识而被PASS掉,同样万丈高楼平地起,任何高大上的东西都离不开基础知识。所以把基础打牢后面的知识学习起来应该会一日千里,这里废话不多说,开始进入主题。

OSI 七层网络模型

开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,ISO/IEC 7498-1),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织(ISO)提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。 — 维基百科

  • 第7层 应用层(Application Layer)
    提供为应用软件而设的界面,以设置与另一应用软件之间的通信。例如: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。

  • 第6层 表示层(Presentation Layer)
    把数据转换为能与接收者的系统格式兼容并适合传输的格式。

  • 第5层 会话层(Session Layer)
    负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。

  • 第4层 传输层(Transport Layer)
    把传输表头(TH)加至数据以形成数据报。传输表头包含了所使用的协议等发送信息。例如:传输控制协议义(TCP) 等。

  • 第3层 网络层(Network Layer)
    决定数据的路径选择和转寄,它网络表头(NH)加至数据报,以形成分组。网络表头包含了网络数据。例如:互联网协议(IP) 等。

  • 第2层 数据链路层(Data Link Layer)
    负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成了帧。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等。

  • 第1层 物理层(Physical Layer)
    在局部局域网络上传送帧,它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器等

TCP/IP

TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能。包含以下四个层次,与OSI7层关系如下:

  1. 网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节,对应的网络协议主要是:Ethernet、FDDI和能传输IP数据包的任何协议。
  2. 网际层,处理分组在网络中的活动,例如分组的选路。网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。
  3. 传输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。他所作的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必须的可靠性必须由应用层来提供。
  4. 应用层负责处理特定的应用程序细节。包括Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传送协议)以及SNMP(简单网络管理协议)等。

TCP概念

TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。

TCP的特点有:

  1. TCP是面向连接的运输层协议
  2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
  3. TCP提供可靠交付的服务
  4. TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
  5. 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流

TCP报文首部结构如下图:

图解:

  1. 源端口号:数据发起者的端口号,16bit
  2. 目的端口号:数据接收者的端口号,16bit
  3. 序号:32bit的序列号,由发送方使用
  4. 确认序号:32bit的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加1。
  5. 首部长度:首部中32bit字的数目,可表示15*32bit=60字节的首部。一般首部长度为20字节。
  6. 保留:6bit, 均为0
  7. 紧急URG:当URG=1时,表示报文段中有紧急数据,应尽快传送。
  8. 确认比特 ACK:ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。
  9. 推送比特 PSH:当发送端PSH=1时,接收端尽快的交付给应用进程。
  10. 复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。
  11. 同步比特 SYN:在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。
  12. 终止比特 FIN:FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。
  13. 窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。
  14. 检验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。
  15. 紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。
  16. 选项:长度可变,最长可达40字节

三次握手建立连接


  • 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

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

完成三次握手,客户端与服务器开始传送数据.

四次挥手断开连接


注意: 中断连接端可以是Client端,也可以是Server端。
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说”我Client端没有数据要发给你了“,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,”告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息“。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,”告诉Client端,好了,我这边数据发完了,准备好关闭连接了“。Client端收到FIN报文后,”就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。Server端收到ACK后,”就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

client经历过程


server经历过程



注意 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

问题


-【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

-【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

完整过程图


TCP连接状态码

  • LISTEN:侦听来自远方的TCP端口的连接请求

  • SYN-SENT:再发送连接请求后等待匹配的连接请求

  • SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认

  • ESTABLISHED:代表一个打开的连接

  • FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

  • FIN-WAIT-2:从远程TCP等待连接中断请求

  • CLOSE-WAIT:等待从本地用户发来的连接中断请求

  • CLOSING:等待远程TCP对连接中断的确认

  • LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认

  • TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

  • CLOSED:没有任何连接状态

火柴 wechat
扫描上方二维码关注我的博客!
0%