TCP/IP协议、三次握手、四次挥手
1、什么是TCP/IP协议
TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合.
传统上来说 TCP/IP 被认为是一个四层协议
1) 网络接口层:
主要是指物理层次的一些接口,比如电缆等.
2) 网络层:
提供独立于硬件的逻辑寻址,实现物理地址与逻辑地址的转换.
在 TCP / IP 协议族中,网络层协议包括 IP 协议(网际协议),ICMP 协议( Internet 互联网控制报文协议),以及 IGMP 协议( Internet 组管理协议).
3) 传输层:
为网络提供了流量控制,错误控制和确认服务.
在 TCP / IP 协议族中有两个互不相同的传输协议: TCP(传输控制协议)和 UDP(用户数据报协议).
4) 应用层:
为网络排错,文件传输,远程控制和 Internet 操作提供具体的应用程序
2.数据包
在 TCP / IP 协议中数据先由上往下将数据装包,然后由下往上拆包
在装包的时候,每一层都会增加一些信息用于传输,这部分信息就叫报头,当上层的数据到达本层的时候,会将数据加上本层的报头打包在一起,继续往下传递.
在拆包的时候,每一层将本层需要的报头读取后,就将剩下的数据往上传.
3.网络接口层
这一块主要主要涉及到一些物理传输,比如以太网,无线局域网.这里就不做详细的介绍了
4.网络层
前面有提到,网络层主要就是做物理地址与逻辑地址之间的转换.
目前市场上应用的最多的是 32 位二进制的 IPv4 ,因为 IPv4 的地址已经不够用了,所以 128 位二进制的 IPv6 应用越来越广泛了(但是下面的介绍都是基于 IPv4 进行的)
1) IP:
TCP/IP 协议网络上的每一个网络适配器都有一个唯一的 IP 地址.
IP 地址是一个 32 位的地址,这个地址通常分成 4 端,每 8 个二进制为一段,但是为了方便阅读,通常会将每段都转换为十进制来显示,比如大家非常熟悉的 192.168.0.1
IP 地址分为两个部分:
网络 ID
主机 ID
但是具体哪部分属于网络 ID,哪些属于主机 ID 并没有规定.
因为有些网络是需要很多主机的,这样的话代表主机 ID 的部分就要更多,但是有些网络需要的主机很少,这样主机 ID 的部分就应该少一些.
绝大部分 IP 地址属于以下几类
A 类地址:IP 地址的前 8 位代表网络 ID ,后 24 位代表主机 ID。
B 类地址:IP 地址的前 16 位代表网络 ID ,后 16 位代表主机 ID。
C 类地址:IP 地址的前 24 位代表网络 ID ,后 8 位代表主机 ID。
这里能够很明显的看出 A 类地址能够提供出的网络 ID 较少,但是每个网络可以拥有非常多的主机
但是我们怎么才能看出一个 IP 地址到底是哪类地址呢?
如果 32 位的 IP 地址以 0 开头,那么它就是一个 A 类地址。
如果 32 位的 IP 地址以 10 开头,那么它就是一个 B 类地址。
如果 32 位的 IP 地址以 110 开头,那么它就是一个 C 类地址。
那么转化为十进制(四段)的话,我们就能以第一段中的十进制数来区分 IP 地址到底是哪类地址了。
注意:
十进制第一段大于 223 的属于 D 类和 E 类地址,这两类比较特殊也不常见,这里就不做详解介绍了。
每一类都有一些排除地址,这些地址并不属于该类,他们是在一些特殊情况使用地址(后面会介绍)
除了这样的方式来划分网络,我们还可以把每个网络划分为更小的网络块,称之为子网(后面会介绍)
全是 0 的主机 ID 代表网络本身,比如说 IP 地址为 130.100.0.0 指的是网络 ID 为130.100 的 B 类地址。
全是 1 的主机 ID 代表广播,是用于向该网络中的全部主机方法消息的。 IP 地址为 130.100.255.255 就是网络 ID 为 130.100 网络的广播地址(二进制 IP 地址中全是 1 ,转换为十进制就是 255 )
以十进制 127 开头的地址都是环回地址。目的地址是环回地址的消息,其实是由本地发送和接收的。主要是用于测试 TCP/IP 软件是否正常工作。我们用 ping 功能的时候,一般用的环回地址是 127.0.0.1
2)地址解析协议 ARP
简单的来说 ARP 的作用就是把 IP 地址映射为物理地址,而与之相反的 RARP(逆向 ARP)就是将物理地址映射为 IP 地址。
3)子网
前面提到了 IP 地址的分类,但是对于 A 类和 B 类地址来说,每个网络下的主机数量太多了,那么网络的传输会变得很低效,并且很不灵活。比如说 IP地址为 100.0.0.0 的 A 类地址,这个网络下的主机数量超过了 1600 万台。
所以子网掩码的出现就是为了解决这样的问题。
我们先回顾一下之前如何区分主机 IP 和网络 IP 的。
以 A 类地址 99.10.10.10 为例,前 8 位是网络 IP ,后 24 位是主机 IP 。(如下图)
子网掩码也是一个 32 为的二进制数,也可以用四个十进制数来分段,他的每一位对应着 IP 地址的相应位置,数值为 1 时代表的是非主机位,数值为 0 时代表是主机位。
由表格可以很清晰的看出,网络 IP 仍是由之前的分类来决定到底是多少位,主机 IP 则是由子网掩码值为 0 的位数来决定,剩下的则是子网 IP
5 传输层
传输层提供了两种到达目标网络的方式
传输控制协议(TCP):提供了完善的错误控制和流量控制,能够确保数据正常传输,是一个面向连接的协议。
用户数据报协议(UDP):只提供了基本的错误检测,是一个无连接的协议。
特点:
1)UDP:
把数据打包
数据大小有限制(64k)
不建立连接
速度快,但可靠性低
2)TCP:
建立连接通道
数据大小无限制
速度慢,但是可靠性高
由于传输层涉及的东西比较多,比如端口,Socket等,都是我们做移动开发需要了解的,之后的文章中我们再具体做介绍,这里就不讲解了。
6 应用层
应用层做为 TCP/IP 协议的最高层级,对于我们移动开发来说,是接触最多的。
运行在TCP协议上的协议:
HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer, or HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本。
FTP(File Transfer Protocol,文件传输协议),由名知义,用于文件传输。
POP3(Post Office Protocol, version 3,邮局协议),收邮件用。
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件。
TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络。
SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用。
运行在UDP协议上的协议:
BOOTP(Boot Protocol,启动协议),应用于无盘设备。
NTP(Network Time Protocol,网络时间协议),用于网络同步。
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。
其他:
DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。
ECHO(Echo Protocol,回绕协议),用于查错及测量应答时间(运行在TCP和UDP协议上)。
SNMP(Simple Network Management Protocol,简单网络管理协议),用于网络信息的收集和网络管理。
ARP(Address Resolution Protocol,地址解析协议),用于动态解析以太网硬件的地址。
2、三次握手
三次握手涉及到的数据段
- 序号seq:TCP连接中每个字节都按顺序编号,seq表示本报文段所发送的数据的第一个字节的序号。
- ACK: 置1表示确认号ack有效。TCP连接建立后所有报文段ACK=1。
- 确认号ack: 表示期望收到对方下一个报文段的第一个数据字节的序号ack。(同时暗示了序号在ack前的字节成功接收)。
- 同步SYN: SYN=1,ACK=0表示一个连接请求报文段(第一次握手)。SYN=1,ACK=1表示这是同意建立连接(第二次握手)
三次握手流程
- A发送(SYN=1,ACK=0)的一个连接请求报文段且不携带数据,seq=x表示该报文所用序号为x。A进入SYN-SENT(同步已发送)状态。
- B接收A连接请求报文,发送SYN=1,ACK=1(ack有效)的同意建立连接报文,ack=x+1期望收到A的下一个数据序号为x+1, seq=y表示该报文所用序号为y。B进入SYN-RCVD(同步收到)状态。
- A接收到同意连接报文,向B发送ACK=1的确认报文段,ack=y+1期望收到B的下一个数据序号为y+1, seq=x+1表示该报文数据第一个序号为x+1。TCP连接建立成功,A进入ESTABLISHED(已建立连接)状态。
- B收到A的确认报文段,进入ESTABLISHED(已建立连接)状态。
两次握手会有什么问题
- A发送第一个连接请求报文x,因为某种原因阻塞了。
- x阻塞后超时,A重新发送连接请求报文y,顺利到达B....成功建立TCP连接发送完数据,释放了。
- x在上述TCP连接释放后到达B后,B发送同意连接报文给A后(第二次握手),就认为重新建立了TCP连接,一直等待A发送数据,造成B资源浪费。
- 三次握手解决思路:3中x到达B后,B需要等A的确认连接(第三次握手)后才认为建立TCP连接。而此时,因为A不需要连接了,所以在接收到B的同意连接报文后舍弃,不会发送确认连接(第三次握手),B在一定时间内没有接收到确认连接,就不会认为连接建立,因此不会造成B资源浪费。
第三次握手失败后
当A与B的第三次握手失败了之后,即A发送至B的确认建立连接报文段未能到达B,B在等待A回复ACK的过程中超时了,那么B会向A发送一个RTS报文段并进入关闭状态。
即:并不等待A第三次握手的ACK包重传,直接关闭连接请求。
这主要是为了防止泛洪攻击,即坏人伪造许多IP向B发送连接请求,从而将B的未连接队列塞满,浪费B的资源。
三次握手有什么缺陷可以被黑客利用,用来对服务器进行攻击?
黑客仿造IP大量的向B发送TCP连接请求报文包,从而将B的半连接队列占满,从而使得B拒绝其他正常的连接请求。
即拒绝服务攻击
怎么防范上述攻击
- 缩短服务器接收客户端SYN报文之后的等待连接时间,即SYN timeout时间,也就是B接收到SYN报文段,到最后放弃此连接请求的超时时间,将SYN timeout设置的更低,便可以成倍的减少B的负荷.但是过低的SYN timeout可能会影响正常的TCP连接的建立,一旦网络不通畅便可能导致A连接请求失败
- SYN cookie + SYN proxy 无缝集成(较好的解决方案)
- SYN cookie:当B接收到A的SYN之后,不立即分配资源,而是根据A发送过来的SYN包计算出一个cookie值,这个cookie值用来存储B返回给A的SYN+ACK数据包中的初始序列号,当A返回第三次握手的ACK包之后进行校验,如果校验成功则B分配资源,建立连接。
- SYN proxy代理,作为B与A连接的代理,代替B与A建立三次握手的连接,同时SYN proxy与A建立好了三次握手连接之后,确保是正常的TCP连接,而不是TCP泛洪攻击,那么SYN proxy就与B建立三次握手连接,作为代理)来连通A与B。
3、四次挥手
四次挥手涉及到的数据段
- 序号seq
- ACK
- 确认号ack
- FIN: FIN=1,表示此报文段的发送方的数据已经发送完毕,要求释放TCP连接
四次挥手流程
- 初始状态A、B处于ESTABLISHED状态
- A的数据已经发送完毕,向B发出连接释放报文段(FIN=1第一次挥手),seq=u表示该报文所用序号为u。A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
- B收到A的连接释放报文后,发出确认报文(ACK=1第二次挥手),ack=u+1表示期望收到A的下一个报文序号为u+1,seq=v表示该报文所用序号为v。B进入CLOSE-WAIT(关闭等待)状态。
- 此时A已经没有数据要发送给B了,但B仍然可以发送数据给A,所以A仍要接收。
- A收到B的确认报文后,进入FIN-WAIT-2(终止等待2)状态,等待B的连接释放报文。
- 假设B发送确认报文(ACK=1)后继续向A发送了一些数据,数据发送完毕,想要释放连接了。此时B向A发送连接释放报文(FIN=1, ACK=1第三次挥手),seq=w表示该报文所用序号为w,ack=u+1因为上次A发送的连接释放报文(FIN=1)序号为u。B进入LAST-ACK(最后确认)状态,等待A的确认。
- A收到B的连接释放报文后,发出确认报文(ACK=1第四次挥手),seq=u+1, ack=w+1。进入TIME-WAIT。
- 此时,TCP连接好没有释放掉,经过2MSL(2个最长报文段寿命)后,进入CLOSED状态,释放掉TCP连接。
- B收到A的确认报文后,进入CLOSED状态,释放掉TCP连接,比A早一些(A在等待2MSL)。
三次挥手会有什么问题
B向A发送链接释放报文(FIN=1,ACK=1)后直接断开连接,如果A没有收到这个FIN数据包,A就会一直处于FINT-WAIT-2状态
等待2MSL原因
- 若A发送给B的第四次挥手报文丢失,B没有收到,1MSL后B重发第三次挥手,保证再过1MSLA可以收到
- 保证在链接阶段所有报文段失效。