一台计算机操作系统中的网络过程包括从应用请求(在协议栈的顶部)到网络介质(底部),OSI参考模型把功能分为七个分立的层次;TCP/IP协议被组织成四个概念层。
一、TCP/IP协议族
互联网协议套件(IPS)是一个网络通信模型,以及一整个网络传输协议家族,为网际网络的基础通讯架构。它常被称为TCP/IP
协议族,简称 TCP/IP。
因为该协定家族的两个核心协定:TCP
(传输控制协议)和IP
(网际协议),为该家族中最早通过的标准。(是最先定义的两个核心协议)
1、TCP/IP 拆家分层
TCP/IP
分层的好处:
- 当某一个地方改变设计时,不用把所有的层替换掉;
- 分层管理,相对比较简单;
- 每一层只需要考虑分派自己的任务。
二、应用层
应用层是大多数普通与网络相关的程序为了通过网络与其他程序通信所使用的层。这个层的处理过程是应用特有的;数据从网络相关的程序以这种应用内部使用的格式进行传送,然后被编码成标准协议的格式。
应用层决定了向用户提供的应用服务时的通信活动:
HTTP
(万维网协议)FTP
(文件传输)SMTP
(电子邮件)SSH
(安全远程登录)DNS
(名称<->IP地址寻找,域名系统)- 以及许多其他协议
一旦从应用程序来的数据被编码成一个标准的应用协议,它将被传送到IP栈的下一层。
三、传输层
传输层位于应用层的下层,提供位于网络连接中两台计算机之间的数据传输,传输层中有两种性质不同的协议。
敲重点:每一个应用层协议一般都会使用到两个传输层协议之一。
TCP
:面向连接的传输控制协议UDP
:无连接的包传输用户数据报协议
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可控 | 可靠,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一、一对多、多对多 | 一对一 |
传输方式 | 面向提交 | 面向字节流 |
首部开销 | 小,8字节 | 最小20,最大60字节 |
场景 | 实时应用(IP电话、视频会议、直播等) | 使用与要求可靠传输的应用,例如文件传输 |
1、传输层的意义
网络层的功能能使我们数据包从一个机器传送到网络上的另一台机器,但这还不足以编写应用程序,因为:
- 机器可以运行多个应用程序,我们需要知道哪个应用应该接受数据包。
- 网络层可以丢弃或重新排序数据包,另一个方面,应用程序通常需要保证(即,无损耗)和按顺序传输字节。
2、何为‘四元组’
TCP
通过定义端口号解决了第一个问题
- 端口号本质上是标识符,有助于
TCP
区分机器上运行的应用。 - 换句话说,计算机上的每个端口号都由该机器上的应用拥有。
- 端口号是2字节整数,0不可用。因此,我们可以在一台机器上拥有65536个端口。
TCP
连接是由源和目标,IP
地址(来自网络层)以及源和目标端口标识。这也称为四元组
源IP地址、目的IP地址 、源端口、目的端口
src ip,dst ip,src port,dst port
3、SEQ
和 ACK
序列号与确认号
TCP
网络中,为了保障每个链接见解提供有保证和有序的字节传递,使用了 Seq
(序列号)和 Ack
(确认号)。
TCP
每次发送与接受的单位为: TCP
头部+数据,TCP数据段。
每个数据的大小不尽相同,有可能达到数百~数万。
SEQ
:系列号,表示每次传输中字节的偏移量;
ACK
:确认号,指出下一个期望接收的 SEQ
(接受完毕)
举个例子:
1、序列号为 #2000
且长度为100
的数据包,在此连接上包含第 2000~2099
个字节。
2、当接收器接收到包括第 2099 字节在内的所有字节时,它发送一个确认 #2100
。
3、表示它已在第2100
字节之前接受到了该字节。
4、SYN
,同步序列号
- 为了避免与先前连接的数据段混淆,当次连线建立时,序列号并非从0开始。
- 两端会使用
ISN
产生器,产生各自的初始序列号(ISN
),通常两者并不相等。 - 连接建立时,透过控制单元(Control Bits)中的
SYN
,让炼骨丹TCP
必须进行ISN
的交换(同步)。
标志位:
- URG:紧急指针有效
- ACK:确认序列号有效
- PSH:接收方应该尽快将这个报文交给应用层
- RST:重置连接
- SYN:发起一个新连接
- FIN:释放一个连接
5、三次握手
在TCP/IP
协议中,TCP
协议提供可靠的连接服务,采用三次握手建立一个连接。
上图就是TCP
的三次握手。
就是TCP
连接的建立方式,且2
和3
,可以组合为单一讯息。
于是就有了下图:
且三次握手中(Client ->Server
),其SEQ
为第一段的值+1(ISN+1
)。
- 第一次握手:
Client(客户端)
先产生一个初始序列号SEQ₁ = ISN(100)
,作为SYN
,并将该数据包发送给Server(服务端)
,客户端
进入SYN_SENT(请求连接)
状态,等到服务端
确认。 - 第二次握手:
服务端
收到数据包后也发送自己的SYN
报文作为响应,并初始化序列号SEQ₂=ISN(300)
,为了确认客户端
的SEQ
,服务端
将客户端
发送的SEQ加1
,作为ACK
发送给客户端
(ACK₂ = SEQ₁+1=100+1=101
),服务端
进入SYN_RCVD(收到请求)
状态。 - 第三次握手:为了确认
服务端
的SYN
,客户端
将服务端
发送的SEQ加1
,作为ACK(ACK₃ = SEQ₂+1=300+1=301)
发送给服务端
。客户端
和服务端
进入了ESTABLISHED(已确立关系)
状态,完成三次握手后,随后客户端
和服务端
之间可以传输数据了。
1)、半连接、半打开、半关闭状态
- 半连接状态:发生在
TCP
三次握手过程中,客户端向服务器发起连接,服务器也进行了回应,但是客户端却不尽行第三次握手。 - 半打开状态:在
TCP
连接中,如果某一端关闭了连接或者是异常关闭,则该连接处于半打开状态。解决半打开问题:引入心跳机制就可以察觉半打开状态。 - 半关闭状态:当
TCP
连接中客户端想服务器发送FIN请求关闭,服务端回应ACK
后,并没有立即发送FIN
给客户端,客户端就处于半关闭状态,此时客户端可以接收服务器发送的数据,但是客户端已经不能再向服务器发送数据。
2)、SYN flood攻击
在三次握手过程中,服务器发送 SYN-ACK
之后,收到客户端的ACK
之前的TCP
连接称为半连接。此时服务器处于SYN-RCVD
(收到请求)状态。会一直等待客户端进行第三次握手(发送ACK
),当收到ACK
后,服务器转为ESTABLISHED
(已确立关系)状态。
SYN
攻击就是攻击客户端在短时间内伪造大量不存在的IP
地址(或者不可达的地址),向服务器不断地发送SYN
包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN
包将长时间占用未连接队列,正常的SYN
请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
//检测是否被SYN攻击
netstat -n -p TCP | grep SYN_RCVD
一般较新的TCP/IP
协议栈都对这一过程进行修正来防范 SYN
攻击,修改TCP
协议实现。主要方法有SynAttackProtect保护机制、SYN cookie技术,增加最大半连接和缩短超时时间等。但是不能完全防范SYN
攻击
3)、为什么需要三次握手
为了保证服务端能够接收到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并做出正确的应答而进行后两次(第二次和第三次)握手。类比:
- 甲—>乙:你来了吗?
- 乙—>甲:我来了,你呢?
- 甲—>乙:我也来了。
4)、服务器一直收不到客户端的ACK会怎么样
在三次握手中,服务端会给每个待完成的半连接都设一个定时器,如果超过时间还没有收到客户端的ACK消息,则重新发送一次SYN-ACK消息给客户端,直到重试超过一定次数时才会放弃。这个时候服务器需要分配内核资源维护半连接。
5)、初始序列号SEQ为什么要随机初始化
这样做主要是为了保证网络安全,如果不是随机产生初始序列号,黑客将会以很容易的方式获取到你与其他主机之间通信的初始化序列号,并且伪造序列号进行攻击,这已经成为一种很常见的网络攻击手段。
6、四次挥手
- 第一次挥手:
Client(客户端)
在建立状态时 发送一个FIN
,Seq=u
,用来关闭Client
到Server(服务端)
的数据传送,Client
进入FIN_WAIT_1(终止等待1)
状态; - 第二次挥手:
Server
收到FIN
后,发送一个ack(u+1)
给Client
,确认序号为收到序号+1(与SYN
相同,一个FIN
占用一个序号),Server
进入CLOSE_WAIT(关闭等待)
状态; - 第三次挥手:
Server
发送一个FIN
,Seq=w
,用来关闭Server
到Client
的数据传送,Server
进入LAST_ACK(最后确认)
状态; - 第四次挥手:
Client
收到FIN
后,Client
进入TIME_WAIT(时间等待)
状态,接着发送一个ack(w+1)
给Server
,确认序号为收到序号+1,Server
进入CLOSED(关闭)
状态,完成四次挥手。
1)、为什么建立三次,关闭是四次
在三次握手时,服务端可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但是四次握手时,服务端发送的FIN和ACK是分开发送的。
原因在于:首先FIN信号是由于调用close所以才发送的,而ACK是由内核发送的,所以ACK报文和FIN报文在发送时间上都是分开的,不一定能同时发送。但是三次握手的时候发送SYN是由内核直接完成的,所以这就可以达到一个同步发送的情况。
2)、CLOSE_WAIT状态有什么影响
如果服务器的代码没有调用close,那么意味着并没有发送FIN结束报文段。那么也就是说,此连接的服务器长期保持在CLOSE_WAIT(关闭等待)状态,
服务器长期处于关闭等待状态,也就是说分配的文件描述符并没有关闭归还,那么大量的CLOSE_WAIT存在的话,就会导致一种资源的泄露,可能到最后就没有可分配的文件描述符了,那么就会使一些客户端无法连接,从而造成不可估量的影响。
3)、socket中的close是一次就关闭的吗?半关闭状态是怎么产生的?
使用close中止一个连接,但它只是减少文件描述符的引用计数,并不直接关闭连接,只有当描述符的引用计数为0的时候才关闭连接。
客户端的半关闭状态:收到服务器的ACK之后,暂时关闭写端,但是读端并没有关闭,依然可以接受来自服务器的数据。
4)、如果已经建立了连接,但是客户端突发故障了怎么办?
TCP设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
四、网络层
网络层用来处理网络上流的数据包(数据包:网络上传输的最小数据单位)。
网络层规定在众多选项中通过怎样的路径(传输线路)到达对方的计算机,把数据包传输给对方。
该层最突出的协议是 Internet协议(IP)
,因此该层也被称为IP
层。IP
层的核心是两个功能:地址和路由。
IP
的原始版本是IPv4
,后来扩展了IPv6
:
IPv4
中规定IP
地址长度为32,即有2³²-1个节点(40亿)-----(我们网络中已经有超过40亿个节点,所以促成了IPv6发展)IPv6
中IP
地址的长度为128,即有2^128-1个节点(2125亿)- 如果
IPv6
被广泛应用后,全世界的每一粒米都会有相应的IP
地址
1、地址
windows
运行ipconfig
linux
运行ifconfig
即可看到IP地址
2、路由
IP路由基于使用地址前缀的规则构建。如果在计算机上运行 netstat -rn
,则可以在计算机上看到路由表。
五、链路层
又名 数据链路层、网络接口层。用来处理连接网络中的硬件部分,硬件上的均在链路层范围中,包含:
- 操作系统
- 硬件设备驱动
NIC
(网络适配器:网卡)- 光纤等物理可见部分
六、TCP/IP通信传输流
TCP/IP
通过分层管理进行网络通信,发送端从应用层往下走,接收端则往应用层上层走。
然后一层层包裹,解析:
- 发送端:每经过一层,会打上该层所属的首部信息。
- 接收端:没经过一层,会把对应的首部信息解析。
七、扩展:运行在传输层中的TCP
和UDP
的协议
每一个应用层(TCP/IP
参考模型的最高层)协议一般都会使用到两个传输层协议之一:
运行在TCP
上的协议:
HTTP(超文本传输协议)
,主要用于普通浏览HTTPS(安全超文本传输协议)
,HTTP协议的安全版本(需要安装ssl证书才可使用)FTP(文件传输协议)
,用于文件传输POP3(邮局协议)
,收邮件用SMTP(简单邮件传输协议)
,用来发送电子邮件TELNET(网络电传)
,通过一个终端(terminal
)登陆到网络SSH(用于代替安全性差的 TELNET)
,用于加密安全登录
运行在UDP上的协议:
BOOTP(启动协议)
,应用于无盘设备NTP(网络时间协议)
,用于网络同步DHCP(动态主机配置协议)
,动态配置IP地址
运行在TCP和UDP协议上:
DNS(域名服务)
,用于完成地址查找,邮件转发等工作。