2.2四次挥手
2.2.1四次挥手的详述
- 假设客户端发起中断连接请求,也就是发送
FIN报文
。服务器端接收到到FIN报文
,意味着客户端没有数据要发送了,但是如果服务器端还有数据没有发送完成,则不必急着关闭Socket
,可以继续发送数据,服务器先发送ACK,意味着服务器端还有数据需要发送。这时候客户端进入FIN_WAIT
状态,继续等待服务器端的FIN报文。 - 当服务器端确定数据发送完成,则向客户端发送FIN报文。告诉客户端这边数据发送完成了,准备好关闭连接了。
- 客户端收到FIN报文后,就知道可以关闭连接了,但是怕服务器端不知道要关闭,所以发送ACK后进入
TIME_WAIT
状态,如果服务器端没有收到ACK则可以重传。 - 服务器端收到ACK后,知道可以断开连接了。客户端等待了
2MSL
(Maximum Segment Lifetime)(最大报文生存时间,任何报文在网络上生存的最大时间,超过这个时间报文将被丢弃)后依然没有收到回复,证明服务器端已正常关闭,然后客户端也关闭连接。TCP连接关闭完成。
数据传输结束后,通信双方都可以释放连接,客户端和服务器端都处于ESTABLISHED
状态。(客户端和服务器端建立连接状态ESTABLISHED
——客户端终止等待1状态FIN-WAIT ——服务器端关闭等待状态CLOSE-WAIT
——客户端终止等待2状态FIN-WAIT-2
——服务器端最后确认状态LAST-ACK
——客户端等待状态TIME-WAIT
——服务器端、客户端关闭状态CLOSED) - (1).的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq = u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待服务器端的确认。
- (2).服务器端收到连接释放报文段后发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),服务器端进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务器端的连接释放。
- (3).客户端收到服务器端的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
- (4).服务器端没有向客户端发出的数据,服务器端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务器端进入LAST-ACK(最后确认)状态,等待客户端的确认。
- (5).客户端收到服务器端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME-WAIT(时间等待)状态。服务器端收到确认报文段后进入CLOSED状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
2.2.2总结四次挥手过程
开始客户端和服务器端处于ESTABLISHED状态——客户端发出连接释放报文段并处于FIN-WAIT-1状态——服务器端发出确认报文段并且进入CLOSE-WAIT状态——客户端收到确认后,进入FIN-WAIT-2状态,等待服务器端的连接释放报文段——服务器端没有向客户端发出的数据,服务器端发出连接释放报文段并且进入LAST-ACK状态——客户端发出确认报文段并且进入TIME-WAIT状态——服务器端收到确认报文段后进入CLOSED状态——客户端经过等待计时器时间2MSL后,进入CLOSED状态。
2.2.3为什么客户端在TIME-WAIT状态必须等待2MSL的时间
MSL最长报文段寿命Maximum Segment Lifetime,MSL=2。
- (1).保证客户端发送的最后一个ACK报文段能够到达服务器端。这个ACK报文段有可能丢失,使得处于LAST-ACK状态的服务器端收不到已发送的FIN+ACK报文段的确认,服务器端超时重传FIN+ACK报文段,而客户端在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务器端都进入CLOSED状态。如果客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务器端重传的FIN+ACK报文段,所以不会再重新发送一次确认报文段,则服务器端无法进入到CLOSED状态。
- (2).客户端在发送完最后一个ACK报文段后,在经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
2.2.4为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当服务器端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接的时候,当服务器端收到FIN报文时,很可能不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”,但是只有等到服务器端所有的报文都发送完了,才能发送FIN报文,因此不能一起发送,所以需要四次握手。
3.TCP和UDP的比较
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20个字节,最大60个字节 |
适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
无连接
:顾名思义,面向连接就是要建立连接,无连接就是不建立连接,UDP不需要和TCP一样在发送数据前进行三次握手建立连接,想发数据就可以开始发送了。
UDP只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。
- 在发送端,应用层把数据传递给传输层的UDP协议,UDP只会给数据层加一个UDP头标识下是UDP协议,然后就传递给网络层。
- 在接收端,网络层将数据传递给传输层,UDP只去除IP报文头就传递给应用层,不会进行任何拼接操作。
4.应用层的协议有哪些 ,ping使用的什么协议,工作在哪一层
4.1 应用层的协议
(1)HTTP
Hyper Text Transfer Protocol,超文本传输协议,。
缺省(默认)
TCP 80端口,用于浏览器浏览网页,但是网页内容为明文,容易篡改、容易劫持、网页内容容易泄漏。
缺省: “缺省”最初来源于计算机英文文档中的单词"default","default”有很多意思:违约、缺省、拖欠、默认,由于当时计算机方面的翻译水平不高,于是就把这个词直译成了“缺省”,其实应该取它的引申意思“默认”。后来的人们发现,无论怎么解释,缺省好像都说不通,但是由于之前的人们已经习惯了“缺省”这个用法,故依旧延续了这个用法。后来的新一辈的人们觉得说起来很拗口,就使用了"default”的引申意思,所以现在在大多数计算机技术文档或者软件里面,采用的都是意译之后的“默认”这个用法。
(2)HTTPS
S代表Security,缺省工作于TCP 443端口,只是在普通的HTTP和TCP层之间多了一个安全加密的夹层,称之为SSL(Secure Socket Layer),用于加密基于HTTP的网页内容,不容易篡改、不容易劫持、网页内容保密,目前广泛用于网上银行等行业。但有安全漏洞,容易受到中间人欺骗攻击。
(3)SMTP
Simple Mail Transfer Protocol,简单邮件传输协议。
用于邮件发送的基于TCP的应用层协议。
(4)POP3
Post Office Protocol - Version 3,邮局协议版本3。
用于邮件接收的基于TCP的应用层协议。
(5)DNS
Domain Name System,域名系统。
用于解析域名与IP地址的基于UDP/TCP应用层协议。
(6)DHCP
Dynamic Host Configuration Protocol,动态主机配置协议。
用于主机动态获取IP地址、缺省网关、DNS服务器等参数的基于UDP应用层协议。
(7)FTP
File Transfer Protocol,文件传输协议。
(8)sftp
SSH File Transfer Protocol,安全文件传送协议。
4.2 ping使用什么协议?工作在哪一层?
ping使用网络层的ICMP协议,工作在应用层。
4.3 ICMP协议
IP协议提供的是尽力而为的服务。IP协议的优点是简单,但缺少差错控制和查询机制。IP分组一旦分出去,是否到达主机,以及在传输过程中出现哪些错误,源主机是不知道的。在这种情况下,如果出现一些问题,例如:路由器找不到目的主机,分组生存时间超过而必须被丢弃。
针对这些问题,设计了一种差错报告与查询、控制机制来了解信息,决定如何处理。ICMP协议就是为解决以上问题而设计的,ICMP的差错与查询、控制功能对于保证TCP/IP协议的可靠性运行是至关重要的。
4.3.1 ICMP的特点
- (1)ICMP协议是在网络层的协议,但是报文不是直接传送给数据链路层,而是封装成IP分组,然后在传送给数据链路层。
- (2)ICMP不能独立于IP协议而单独存在,是IP协议的一个组成部分。
- (3)ICMP只能搭配IPV4使用,如果是IPV6,需要使用的是ICMPv6。
4.3.2 ICMP的功能
- (1)确认IP包能否成功到达目的地址;
- (2)通知在发送过程中IP包被丢弃的原因。
4.3.3 ICMP报文格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YY4bEEWo-1572435447764)(C:\Users\田洪康\AppData\Roaming\Typora\typora-user-images\image-20191030191028972.png)]
ICMP报文分为两类:差错报告报文与询问报文。
类型 | 内容 |
---|---|
0 | 回送应答 |
3 | 目标不可达 |
4 | 原点抑制 |
5 | 重定向或改变路由 |
8 | 回送请求 |
9 | 路由器公告 |
10 | 路由器请求 |
11 | 超时 |
17 | 地址子网请求 |
18 | 地址子网应答 |
以下几种情况不产生差错报告报文
(1)对于分片的分组,如果不是第一个分片出错。
(2)多播分组出错。
(3)具有特殊地址(127.0.0.0或0.0.0.0)的分组出错。
4.4 ping命令
Packet Internet Gtoper,因特网控制消息协议。
ping后面跟的是域名,不是URL。ping是Windows、Unix和Linux系统下的一个命令,也属于一个通信协议,是TCP/IP的一部分,用于在IP主机、路由器之间传递控制信息。
4.4.1 ping的作用
- (1)利用ping可以查看网络的连通性,更好地帮助我们分析和判断网络故障。ping发送一个ICMP,
回声请求( echorequest )
消息给目的地并报告是否收到所希望的ICMP echo(ICMP回声应答)( echorepy )
,是用来检测网络是否畅通或者网络连接速度的命令。 - (2)ping也会统计响应时间和
TTL(生存周期)(Time To Live)
。
4.4.2 ping的原理
向指定的网络地址发送一个长度的数据包(ICMP Echo Request),按照约定,若指定网络地址存在,会返回同样大小的数据包(ICMP Echo Reply)。若没有返回,就是超时了,会认为指定的网络地址不存在。
ICMP协议通过IP协议发送。
- 在Liunx/Unix系统下,序号从0开始计数,依次递增。
- 在Windows ping程序的ICMP没有规律。
ping没有端口号,端口号是传输层的内容,ping不使用TCP/UDP,跨过传输层,在网络层用的是ICMP协议,属于原生套接字,不需要端口号。