网络_协议

发布于:2025-08-31 ⋅ 阅读:(23) ⋅ 点赞:(0)

 关键词:

OSI是Open System Interconnect的缩写,意为开放式系统互联。

RTT : Round-Trip time 往返时间

RTO:Retransmission Timeout超时重传时间

MSL : 

OSI 七层模型和 TCP/IP 四层模型

OSI七层模型和TCP/IP五层模型(原来应该是四层,新版教程改成五层)的映射关系,以及对应的功能和协议:

image

OSI七层模型 TCP/IP五层模型 对应网络协议 功能
应用层(Application) 应用层(Application) HTTP、TFTP, FTP, NFS, WAIS、SMTP 文本传输、电子邮件、文件服务、虚拟终端等
表示层(Presentation) Telnet, Rlogin, SNMP, Gopher 数据格式化、代码转换、数据加密
会话层(Session) SMTP, DNS 解除/建立与别的连接点的Connection
传输层(Transport) 传输层(Transport) TCP, UDP 提供端对端接口
网络层(Network) 网络层(Network) IP, ICMP, ARP, RARP, AKP, UUCP 为数据包提供路由选择
数据链路层(Data Link) 数据链路层(Data Link) FDDI, Ethernet, Arpanet, PDN, SLIP, PPP 传输带地址的帧、提供错误检测功能
物理层(Physical) 物理层(Physical) IEEE 802.1A, IEEE 802.2到IEEE 802.11 以二进制数据形式在物理媒介上传输数据

无论哪种模型,都可以看出来,四层是指传输层,七层是指应用层

TCP三次握手四次挥手

TCP是面向连接的,所有的连接是指双方都确认了连接的建立。

三次握手

我们来看一下三次握手的过程:

  • 一开始,客户端和服务端都处于 CLOSED 状态。客户端主动打开连接,服务端被动打卡连接,结束CLOSED 状态,开始监听,进入 LISTEN状态。

一次握手

客户端会随机初始化序号(client_isn),

  • 将此序号置于 TCP 首部的「序号」字段中,
  • 同时把 SYN 标志位置为 1 ,表示 SYN 报文。

接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接。该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

二次握手

服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),

  • 将此序号填入 TCP 首部的「序号」字段中,
  • 其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1,
  • 接着把 SYN 和 ACK 标志位置为 1

最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。

三次握手

客户端收到服务端报文后,还要向服务端回应最后一个应答报文,

  • 首先该应答报文 TCP 首部 ACK 标志位置为 1 ,
  • 其次「确认应答号」字段填入 server_isn + 1 ,

最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。

好了,经过三次握手的过程,客户端和服务端之间的确定连接正常,接下来进入ESTABLISHED状态,服务端和客户端就可以快乐地通信了。

问题:为什么是三次,不是两次、四次?

两次:如果只有前两次,服务端会认为连接已经建立,如果客户端后续不在发送报文,也就是客户端不认可这个链接,相当于这个连接资源浪费了。

四次:三次就可以完成双方的确认,没有必要多进行一次。

四次挥手

一次挥手

  • 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。

二次挥手

  • 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。

三次挥手

  • 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。

四次挥手

  • 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
  • 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭
  • 客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。

可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手

问题:为什么是四次,不是三次?

三次:如果是三次,需要将服务端的ACK和FIN包合成一次发送,但是服务端在收到客户端的FIN包后,需要释放资源等各种善后操作,这个会比较浪费时间,导致给客户端端的响应时间超时,从而导致客户端重发FIN包。 所以将服务端的ACK和FIN分开发送。

思考:为什么握手需要经过双方对彼此的确认, 而挥手只需要一方对另一方的确认就可以了呢?

握手需要双方对彼此的确认,是要保证连接得到双方认可(不浪费);挥手其实也是双方对彼此的确认, 只不过是分两阶段进行的。

TCP与UDP

TCP是一个面向连接的、可靠的、基于字节流的传输层协议。

UDP是一个面向无连接的传输层协议。

面向连接:指的是客户端和服务端建立连接,在双方相互通信之前,TCP需要三次握手建立连接,而UDP没有建立连接的过程。

可靠性:TCP花了很多的功夫保障连接的可靠性

  • TCP有状态:TCP会进准记录哪些数据发送了,哪些数据被对方接受了,哪些没有被接受,而且保证数据包按序到达,不允许半点差错。
  • TCP可空:意识到丢包了或者网络环境不佳,TCP会根据情况调整自己的行为,控制自己的发送速度或者重发。

报文中的序列号

凡是对端的确认都需要序列号,防止端发送重复的报文。这样也使得调用有顺序性。

TCP中的端口号

端口号位于传输层的TCP报文头中。端口号用两个字节表示,最大值65535

1. 熟知的端口号:0~1023

  • HTTP: 80
  • HTTPS: 443
  • FTP: 21
  • SSH: 22
  • Telnet: 23
  • SMTP: 25
  • DNS: 53

2. 已登记的端口号:1024~49151

  • MySQL: 3306
  • Oracle DB: 1521
  • Redis: 6379
  • MongoDB: 27017
  • Tomcat: 8080

3. 临时端口号:49152~65535 

        你的浏览器在访问网站时,操作系统会随机分配这个范围内的一个端口作为源端口

telnet用法

1. telnet ip/domianName  port :远端这个地址下的这个端口是否可以访问

2. telnet 发送http请求

输入红框里的内容, 发送http请求,就会得到http的响应

curl  命令同样可以访问网络域名

netstat

> netstat -at

> netstat -au

tcpdump

是一个命令行的网络流量分析工具,功能非常强大,一般用于抓TCP的包。

tcpdump -i any host 180.101.49.44

  • tcpdump 抓包
  • -i  在机器的网卡上抓包
  • any 任意网卡
  • 180.101.49.44  某次测试时百度的地址

 参考:

1. 深入分析四层/七层网关 - Hello-Brand - 博客园

2. “三次握手,四次挥手”这么讲,保证你忘不了 - 三分恶 - 博客园


网站公告

今日签到

点亮在社区的每一天
去签到