网络通讯模型
OSI
OSI (Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型。
国际标准化组织ISO制定了网络互连的七层框架的一个参考模型,称为开放系统互连参考模型
该体系结构标准定义了网络互联的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层)
TCP/IP
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
TCP/IP协议在一定程度上参考了OSI的体系结构。OSI模型共有七层,从下到上分别是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。但是这显然是有些复杂的,所以在TCP/IP协议中,它们被简化为了四(五)个层次。
特点
TCP/IP协议能够迅速发展起来并成为事实上的标准,是它恰好适应了世界范围内数据通信的需要。它有以下特点:
- 协议标准是完全开放的,可以供用户免费使用,并且独立于特定的计算机硬件与操作系统。
- 独立于网络硬件系统,可以运行在广域网,更适合于互联网。
- 网络地址统一分配,网络中每一设备和终端都具有一个唯一地址。
- 高层协议标准化,可以提供多种多样可靠网络服务。
TCP/IP 和 OSI 异同点
-
相同点
两者都是以协议栈的概念为基础的
协议栈中的协议彼此相互独立
下层对上层提供服务 -
不同点
OSI是先有模型 - TCP/IP是先有协议,后有模型
OSI适用于各种协议栈 - TCP/IP只适用于TCP/IP网络
层次数量不同
TCP/IP 模型
File Transfer # 文件管理
E-Mail # 电子邮件
Remote Login # 远程登录
Network Management # 网络管理
Name Management # 域名网络管理
我们简单的了解一下层数的变化即可,对于下5层还是一样的,下面来说说 TCP 和他的 报文格式
TCP
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
三握四挥 这里不做详细了解
建立连接
SYN 是同步信息,ACK是确认信息,都是报文
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答 SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。
TCP三次握手的过程如下:
- 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
- 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
- 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
连接终止
建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。
-
某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
-
接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
-
一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
-
接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
TCP 报文格式
-
Source port 源端口
-
Destination port 目的端口
他俩都是 16bit,在主机中一共有 65536个端口号,
1-1023 公认端口号(80,443,21,23),1024-49151 注册端口号,49152-65535 私有端口号
-
Sequence number 顺序号
-
Acknowledgement number 确认号
实现数据确认重传,如果出现了丢包的问题,会将数据重新传输
-
Header length 头长度
TCP报文头的长度 -
Reserved 保留位
提供 -
Code bits 代码位
-
Window 窗口
协调数据传动的多少,电脑缓存的大小 影响窗口的大小 -
Checksum 校验和
检验TCP报文是否有损坏 -
Urgent 紧急指针
指示数据是否需要紧急发送 -
Options 选项
-
Data 数据
上层传输下来的数据
TCP 报文格式的基本新就已 全部OK
三次握手,欲传输数据
seq 第一次 顺序号随机产生,之后的 对端确认号 +1,ack 确认号 是 对端顺序号 +1,ctl 同步确认 信息
- 主机A 向 主机B发送 同步信息,携带(随即生成顺序号 100)
- 主机B 收到并回溯 同步确认信息,携带 (对端顺序号 +1 成为自己的确认号101,和随意生成的顺序号300)
- 主机A 收到并发送确认信息,携带(对端确认号 +1 成为自己的顺序号,对端顺序号 +1 成为确认号)
- 总的来说就是你发送给对方的号 他再给你送回来,名字反转而已。
建立成功
确认重传
传输时就是 源端口,目的端口,顺序号,确认号的交替。过程和建立连接是一样的。
图中描述的很清楚了,这里不多说。
窗口控流
图解:
- 每次只发送一个效率太慢,窗口大小为2 Window size=3 同时发送3个数据包
- 接收方 只能收两个,确认第三个丢弃,并告知发送端 Window size = 2,我只能一次收到两个
- 发送防守到确认调整窗口大小 Window size=2,发送丢弃的 3 和 新的 4.