TCPIP协议、三次握⼿、四次挥⼿
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 地址属于以下⼏类
tcpip协议pdfA 类地址:IP 地址的前 8 位代表⽹络 ID ,后 24 位代表主机ID。
B 类地址:IP 地址的前 16 位代表⽹络 ID ,后 16 位代表主机ID。
C 类地址:IP 地址的前 24 位代表⽹络 I
D ,后 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、三次握⼿
三次握⼿涉及到的数据段
1. 序号seq:TCP连接中每个字节都按顺序编号,seq表⽰本报⽂段所发送的数据的第⼀个字节的序号。
2. ACK: 置1表⽰确认号ack有效。TCP连接建⽴后所有报⽂段ACK=1。
3. 确认号ack: 表⽰期望收到对⽅下⼀个报⽂段的第⼀个数据字节的序号ack。(同时暗⽰了序号在ack前的字节成功接收)。
4. 同步SYN: SYN=1,ACK=0表⽰⼀个连接请求报⽂段(第⼀次握⼿)。SYN=1,ACK=1表⽰这是同意建⽴连接(第⼆次握⼿)
三次握⼿流程
1. A发送(SYN=1,ACK=0)的⼀个连接请求报⽂段且不携带数据,seq=x表⽰该报⽂所⽤序号为x。A进⼊SYN-SENT(同步已发送)状态。
2. B接收A连接请求报⽂,发送SYN=1,ACK=1(ack有效)的同意建⽴连接报⽂,ack=x+1期望收到A的下⼀个数据序号为x+1, seq=y表⽰该
报⽂所⽤序号为y。B进⼊SYN-RCVD(同步收到)状态。
3. A接收到同意连接报⽂,向B发送ACK=1的确认报⽂段,ack=y+1期望收到B的下⼀个数据序号为y+1, seq=x+1表⽰该报⽂数据第⼀个
序号为x+1。TCP连接建⽴成功,A进⼊ESTABLISHED(已建⽴连接)状态。
4. B收到A的确认报⽂段,进⼊ESTABLISHED(已建⽴连接)状态。
两次握⼿会有什么问题
1. A发送第⼀个连接请求报⽂x,因为某种原因阻塞了。
2. x阻塞后超时,A重新发送连接请求报⽂y,顺利到达B....成功建⽴TCP连接发送完数据,释放了。
3. x在上述TCP连接释放后到达B后,B发送同意连接报⽂给A后(第⼆次握⼿),就认为重新建⽴了TCP连接,⼀直等待A发送数据,造成B
资源浪费。
4. 三次握⼿解决思路: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拒绝其他正常的连接请求。
即拒绝服务攻击
怎么防范上述攻击
1. 缩短服务器接收客户端SYN报⽂之后的等待连接时间,即SYN timeout时间,也就是B接收到SYN报⽂段,到最后放弃此连接请求的超
时时间,将SYN timeout设置的更低,便可以成倍的减少B的负荷.但是过低的SYN timeout可能会影响正常的TCP连接的建⽴,⼀旦⽹络不通畅便可能导致A连接请求失败
2. SYN cookie + SYN proxy ⽆缝集成(较好的解决⽅案)
1. SYN cookie:当B接收到A的SYN之后,不⽴即分配资源,⽽是根据A发送过来的SYN包计算出⼀个cookie值,这个cookie值⽤
来存储B返回给A的SYN+ACK数据包中的初始序列号,当A返回第三次握⼿的ACK包之后进⾏校验,如果校验成功则B分配资
源,建⽴连接。
2. SYN proxy代理,作为B与A连接的代理,代替B与A建⽴三次握⼿的连接,同时SYN proxy与A建⽴好了三次握⼿连接之后,确保
是正常的TCP连接,⽽不是TCP泛洪攻击,那么SYN proxy就与B建⽴三次握⼿连接,作为代理)来连通A与B。
3、四次挥⼿
四次挥⼿涉及到的数据段
1. 序号seq
2. ACK
3. 确认号ack
4. FIN: FIN=1,表⽰此报⽂段的发送⽅的数据已经发送完毕,要求释放TCP连接
四次挥⼿流程
1. 初始状态A、B处于ESTABLISHED状态
2. A的数据已经发送完毕,向B发出连接释放报⽂段(FIN=1第⼀次挥⼿),seq=u表⽰该报⽂所⽤序号为u。A进⼊FIN-WAIT-1(终⽌等待
1)状态,等待B的确认。
3. B收到A的连接释放报⽂后,发出确认报⽂(ACK=1第⼆次挥⼿),ack=u+1表⽰期望收到A的下⼀个报⽂序号为u+1,seq=v表⽰该报⽂
所⽤序号为v。B进⼊CLOSE-WAIT(关闭等待)状态。
4. 此时A已经没有数据要发送给B了,但B仍然可以发送数据给A,所以A仍要接收。
5. A收到B的确认报⽂后,进⼊FIN-WAIT-2(终⽌等待2)状态,等待B的连接释放报⽂。
6. 假设B发送确认报⽂(ACK=1)后继续向A发送了⼀些数据,数据发送完毕,想要释放连接了。此时B向A发送连接释放报⽂(FIN=1,
ACK=1第三次挥⼿),seq=w表⽰该报⽂所⽤序号为w,ack=u+1因为上次A发送的连接释放报⽂(FIN=1)序号为u。B进⼊LAST-ACK(最后确认)状态,等待A的确认。
7. A收到B的连接释放报⽂后,发出确认报⽂(ACK=1第四次挥⼿),seq=u+1, ack=w+1。进⼊TIME-WAIT。
8. 此时,TCP连接好没有释放掉,经过2MSL(2个最长报⽂段寿命)后,进⼊CLOSED状态,释放掉TCP连接。
9. B收到A的确认报⽂后,进⼊CLOSED状态,释放掉TCP连接,⽐A早⼀些(A在等待2MSL)。
三次挥⼿会有什么问题
B向A发送链接释放报⽂(FIN=1,ACK=1)后直接断开连接,如果A没有收到这个FIN数据包,A就会⼀直处于FINT-WAIT-2状态

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。