TCP/IP三次握手四次挥手

前言

在闲暇之余复习一下TCP/IP也算是为面试做点准备吧。。。。
本文参考自https://www.jianshu.com/p/9f3e879a4c9c,对作者表示衷心感谢。

1.TCP/IP是什么?

Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

2.分层结构

OSI七层模型 TCP/IP概念模型 功能 协议族
应用层 应用层 文件传输、电子邮件、文件服务、虚拟终端 TFTP、HTTP、SNMP、FTP、DNS、TELNET
表示层 数据格式化、代码转换、数据加密
会话层 解除与建立与别的节点的联系
传输层 传输层 提供端对端的接口 TCP、UDP
网络层 网络层 为数据包选择路由 IP、ICMP、OSPF、RIP
数据链入层 网络接口层 传输有地址的帧以及错误检测 ARP、RARP
物理层 以二进制数据形式在物理媒体上传输数据 IEEE802

本篇文章主要描述传输层以及网络层的TCP/IP:

3.UDP/TCP区别

  1. TCP: 它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。根据 TCP 的这些机制,在 IP 这种无连接的网络上也能够实现高可靠性的通信( 主要通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现)。

  2. UDP: 利用 IP 提供面向无连接的通信服务,UDP 也无法进行流量控制等避免网络拥塞行为。此外,传输途中出现丢包,UDP 也不负责重发。甚至当包的到达顺序出现乱序时也没有纠正的功能。如果需要以上的细节控制,不得不交由采用 UDP 的应用程序去处理。UDP 常用于一下几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)。

4.三次握手(重点)

1.TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。
2.所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。
3.在socket编程中,这一过程由客户端执行connect来触发。

三次握手的流程图:

TCP/IP三次握手四次挥手_第1张图片

具体流程:

  1. 第一次握手: 客户端将标志SNY置为1,随机产生一个seq=J;并将该数据包发送给服务器,客户端进入SYN_SENT状态,等待服务器确认。
  2. 第二次握手: 服务端收到该数据包,并由SNY=1得知客户端请求建立连接;将SNY,ACK置为1,将ack置为J+1,随机产生一个K并赋予seq;将该数据包发送给客户端确认请求,进入SYN_RCVD状态。
  3. 第三次握手: 客户端收到该数据包后。判断ack是否为J+1,ACK是否为1;如果正确则将ACK置为1,ack置为K+1;并将该数据包发送给服务端,服务端判断ACK=1,ack=K+1,如果正确客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

5.四次挥手(重点)

1.四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
2.在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

?:由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

四次挥手的流程图:
TCP/IP三次握手四次挥手_第2张图片

具体流程:(终断连接可以是客户端也可以是服务端)

  1. 第一次挥手: 客户端发送一个FIN=M,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。此状态含义为:如果服务端还存在未发送完的数据,则等待发送成功后在关闭,此时等待关闭。
  2. 第二次挥手: 服务端收到客户端的FIN=M请求后,返回一个ack=M+1告诉客户端,还存在需要发送的数据,继续等待关闭,客户端进入FIN_WAIT_2状态,继续等待服务端的FIN报文。
  3. 第三次挥手: 当服务端确认没有数据时,向客户端发送FIN=N,告诉客户端,我准备好了准备关闭连接,服务端进入LAST_ACK状态。
  4. 第四次挥手: 客户端收到报文后,知道可以关闭连接,但是不相信网络,怕服务器不知道要进行关闭,所以发送ack=N+1,ACK=1进入TIME_WAIT状态,如果服务端没收到ACK=1,则重传;收到则断开连接。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,客户端也可以关闭连接了。最终完成了四次握手。

上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,
具体流程如下图:
TCP/IP三次握手四次挥手_第3张图片

各个状态的意义如下:
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 - 没有任何连接状态;

你可能感兴趣的:(TCP/IP三次握手四次挥手)