开篇故事 —— “亘亘面试大战三次握手四次挥手”
入戏:
一天,亘亘出去找工作,面试……
面试官巨佬:“说下你对TCP协议的3次握手过程的理解?另外,4次挥手又怎么理解,为什么握手是3次,挥手却要4次呢?”
亘亘:“吧啦吧啦”
面试官:恩,我这边没什么要问的了,你有什么问我的吗?恩,今天先这样吧,您回去等消息吧!
大家对以上的场景熟悉么?当你跪着走出面试公司大门按下电梯的时候,第一反应是不是打开safari百度:3次握手、4次挥手,然后百度给你咔咔咔一顿出来好多文章,你揉着眼睛看完,尴尬的把手机装进兜里,继续前行!(其实并没有真正理解),那么,看了我这篇文章,你再回来看看这个故事!
Over!!!
issue: 那么,到底什么是3次握手和4次挥手呢?
目录
-
什么是TCP/IP协议
-
TCP的协议报文格式
-
简化概念:三下次握手和四次挥手
-
专业术语:直视三握四挥
-
协议家族成员简介
-
结束语
1.什么是TCP/IP协议
答:这个问题,真的很复杂,首先,我们先弄明白一些概念,往下看,老铁⬇️,出招吧,朋友!
-
分层
网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统(众多协议的协议族统称),如图1-1所示。
TCP/IP协议族分为四层:链路层、网络层、运输层和应用层,每一层各有不同的责任。在TCP/IP中,网络层和运输层之间的区别是最为关键的:网络层(IP)提供点到点的服务,而运输层(TCP和UDP)提供端到端的服务。
>链路层:
链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
1>网络层:
网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。
>运输层
运输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。
TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。
而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。
这两种运输层协议分别在不同的应用程序中有不同的用途
>应用层
应用层负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些通用的应用程序:
• Telnet远程登录。
• FTP文件传输协议。
• SMTP简单邮件传送协议。
• SNMP简单网络管理协议。
下图是TCP/IP协议族每层包含的不同协议,大家感受下:
此致,敬礼!再深入的讲解每层、每个协议的具体概念,我也说不清楚,而且篇幅很大,3天3夜也嗨不完,大家有兴趣的话自行查阅资料吧,这里推荐大家一本书:《TCP/IP详解 卷1》,孜孜不倦者,攻读完这本书感觉网络就那么回事了!
2. TCP的协议报文格式
想了解三次握手和四次挥手,我们又要搞懂另一个概念,就是:
TCP报文格式
这也太6了吧,一会一个概念,一会一个新东西冒出来,没办法,技术的深度永远深不可测,往深里挖掘的同时才能意识到自己有多愚钝 -- 鲁迅 2019年春.
- TCP首部
TCP数据被封装在一个IP数据报中,如图1-3所示。
图1-4显示TCP首部的数据格式。如果不计任选字段,它通常是20个字节。
上图中有几个字段需要重点介绍下:
(1)序号Seq:
序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。序号是32 bit的无符号数,序号到达232-1后又从0开始。
(2)确认序号Ack:
Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接
注意:
1>不要将确认序号Ack与标志位中的ACK搞混了。
2>确认方Ack=发起方Req+1,值配对。
3.简化概念:三下次握手和四次挥手
- 白话版理解:
TCP提供了一种可靠的面向连接的字节流运输层服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。
两个人的对话也可以比喻:
甲:嗨,你好啊
乙:嗨,你好!
如果没有前面甲的打招呼,乙直接说,嗨,你好,是不是不正常?周围的人会说,乙是个神经病吧,哈哈,同样,如果甲没有看到乙,自己自言自语的突然说嗨你好,显得也不太正常
同样,两个人交谈完毕之后,会打个招呼才会转身离开,而不是直接走开互相不告诉对方,这便是我们要理解的四次挥手的概念的核心
- 结论:两个人对话需要建立关系(连接),同样,一个TCP的连接请求服务同样也需要建立某种机制,不然全TM乱了。其实说白了,三次握手和四次挥手,是Client端和Service端在TCP协议基础上的一次完整数据传输过程!
这个完整数据,可以理解为一个数据包,因为网络连接本来就是数据包的传输过程
4.专业术语:直视三握四挥
三次握手详解
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图1-5所示:
1)第一次握手:
Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
2)第二次握手:
Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
3)第三次握手:
Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
四次挥手详解
所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图1-6所示:
由于TCP连接时双向的,因此,每个方向都必须要单独进行关闭,也就是说当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,但是并不意味对方过来的数据流动也会关闭,当一端收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是这个TCP连接上仍然能够发送数据,直到另一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上面的示意图就是这个概念。
1)第一次挥手:
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2)第二次挥手:
Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3)第三次挥手:
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
4)第四次挥手:
Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
错误提示:由于图片是网络上找的,第4次挥手的ack应该是:ack=N+1,而不是K+1
- 补充:SYN攻击是怎么回事?
三次握手过程中,Server端发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),也就是说第二次握手之后到第三次握手之前这个状态,此时Server端处于SYN_RCVD状态,当收到ACK后,Server端变为ESTABLISHED状态。SYN攻击就是Client端在短时间内伪造大量不存在的IP地址,
当然这个Client端是假的伪造的
,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于Client端本身就是伪造的,源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
netstat -nap | grep SYN_RECV
5.协议家族其他层协议成员介绍
再把上面的图贴过来:
这些协议,挑选自己接触到的,灵活掌握了解就可以了
1)UDP
UDP,用户数据包协议,为应用程序发送和接收数据报。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的一定字节数的信息)。但是与TCP不同的是,UDP是不可靠的,它不能保证数据报能安全无误地到达最终目的。
2)IP-网际协议
IP是网络层上的主要协议,同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。在图1-4中,我们给出了一个直接访问IP的应用程序。这是很少见的,但也是可能的(一些较老的选路协议就是以这种方式来实现的。当然新的运输层协议也有可能使用这种方式)。
- IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输(见图1-4)。许多刚开始接触TCP/IP的人对IP提供不可靠、无连接的数据报传送服务感到很奇怪,特别是那些具有X.25或SNA背景知识的人。
- 不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。
- 无连接(connectionless)这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。
3)ICMP-Internet控制报文协议
ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。第6章对ICMP的有关细节进行讨论。尽管ICMP主要被IP使用,但应用程序也有可能访问它。我们将分析两个流行的诊断工具,Ping和Traceroute,它们都使用了ICMP。
4)IGMP-Internet组管理协议
IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。
它让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。正如ICMP一样,IGMP也被当作IP层的一部分。IGMP报文通过IP数据报进行传输。不像我们已经见到的其他协议,IGMP有固定的报文长度,没有可选数据。
5)ARP-地址解析协议
ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。我们分别在第4章和第5章对这两种协议进行分析和介绍。
6)FTP-文件传送协议
FTP是另一个常见的应用程序。它是用于文件传输的Internet标准。我们必须分清文件传送(file transfer)和文件存取(file access)之间的区别,前者是FTP提供的,后者是如NFS(Sun的网络文件系统,第29章)等应用系统提供的。由FTP提供的文件传送是将一个完整的文件从一个系统复制到另一个系统中。要使用FTP,就需要有登录服务器的注册帐号,或者通过允许匿名FTP的服务器来使用(本章我们将给出这样的一个例子)。
7)SMTP-简单邮件传送协议
电子邮件(e-mail)无疑是最流行的应用程序。[Caceres et al.1991]说明,所有TCP连接中大约一半是用于简单邮件传送协议SMTP(Simple Mail Transfer Protocol)的(以比特计算为基础,FTP连接传送更多的数据)。[Paxson 1993] 发现,平均每个邮件中包含大约1500字节的数据,但有的邮件中包含兆比特的数据,因为有时电子邮件也用于发送文件。
8) SNMP-简单网络管理协议
管理进程和代理进程之间的通信协议,叫做简单网络管理协议SNMP(Simple Network Management Protocol)。SNMP包括数据报交换的格式等。尽管可以在运输层采用各种各样的协议,但是在SNMP中,用得最多的协议还是UDP。
9)TFTP-简单文件传送协议
TFTP(Trivial File Transfer Protocol)即简单文件传送协议,最初打算用于引导无盘系统(通常是工作站或X终端)。和TCP的文件传送协议(FTP)不同,为了保持简单和短小,TFTP将使用UDP。TFTP的代码(和它所需要的UDP、IP和设备驱动程序)都能适合只读存储器。
10)BOOTP-引导程序协议
一种用于无盘系统进行系统引导的替代方法,又称为引导程序协议,或BOOTP。BOOTP使用UDP,且通常需与TFTP协同工作
6.结束语
网络、协议是一个很庞大的知识系统,我们需要多用,多看,多学习,才能真正弄明白他们的细枝末节,TCP/IP协议族,真的太庞大了,我困了,睡觉了!
- 广告位:
shLuckySeven