TCP/IP协议学习笔记
一个协议族,比如TCP / IP,是一组不同层次上的多个协议的组合。TCP / IP通常被认为是一个四层协议系统,如图所示。
分层.png- 每一层负责不同的功能:
- 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。它的作用:
为IP模块发送和接收IP数据报,
为ARP模块发送ARP请求和接收ARP应答(ARP:地址解析协议,将IP地 址转换成MAC地址),
为RARP发送RARP请求和接收RARP应答。
- 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在TCP / IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。
- 运输层主要为两台主机上的应用程序提供端到端的通信。在TCP / IP协议族中,有两个互不相同的传输协议: TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。
而另一方面, UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。这两种运输层协议分别在不同的应用程序中有不同的用途,这一点将在后面看到。 - 应用层负责处理特定的应用程序细节。几乎各种不同的TCP / IP实现都会提供下面这些通用的应用程序:
- Telnet 远程登录。
- FTP 文件传输协议。
- SMTP 简单邮件传送协议。
注:
- 互联网地址:也就是IP地址,一般为网络号+子网号+主机号
- 域名系统(DNS):通俗的来说,就是一个数据库,可以将主机名转换成IP地址
- RFC:TCP/IP协议的标准文档
- 端口号:一个逻辑号码,IP包所带有的标记
- Socket:应用编程接口
接下来我们了解一下TCP/IP的工作流程:
当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息。
封装.png当应用程序从TCP接收数据时,首先数据链路层从ARP得到数据的传递信息,再从IP得到具体的数据信息
IP首部.pngIP协议头当中,最重要的就是TTL(IP允许通过的最大网段数量)字段(8bit),规定该数据包能穿过几个路由之后才会被抛弃。
当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用( Demultiplexing)。
分用.pngIP路由选择
IP路由选择是简单的,特别对于主机来说。如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。大多数的主机都是采用这种简单机制。
IP路由选择.png
ARP协议工作原理
ARP协议工作原理.pngICMP协议(网络控制文协议)
将IP数据包不能传送的错误信息传送给主机
查询报文
- ping查询:主机是否可达,通过计算间隔时间和传送多少个包的数量
- 子网掩码(32bit):告诉目的主机需要多少比特用于子网号,多少比特用于主机号
- 时间戳:获得当前时间
差错报文
不产生的情况:
- ICMP差错报文不产生差错报文
- 源地址为零地址、环目地址、广播地址、多播地址
IP路由器选择协议
先来看路由选择工作流程:
路由选择.png-
静态路由选择
- 配置接口以默认方式生成路由表项,或者使用route add手动添加表项
-
ICMP报文(ICMP重定向报文)更新表项
-
动态路由选择(只使用在路由之间)
-
RIP(路由信息协议)
分布式的基于距离向量(路由器到每一个目的网络的距离记录)的路由选择协议
router承担的工作:- 给每一个已知路由器发送RIP请求报文,要求给出完整的路由表
-
如果接受请求,就将自己的路由表交给请求者;如果没有,就处理IP请求表项(自己部分+跳数/没有的部分+16)
-
接受回应,更新路由表
-
定期更新路由表(一般为30s)
-
OSPF(开放最短路径优先协议)
分布式链路状态(和这两个路由器都有接口的网络)协议- 当链路状态发生变化时,采用可靠的洪泛法,向所有的路由器发送信息(相邻的所有路由器的链路状态)
- 最终会建立一个全网的拓扑结构图
TCP/IP的建立与断开
TCP报头最小长度:20字节
首先我们先来了解TCP报文段
重要的标志我在图中也有标记,重点了解标志位
- URG: 紧急指针( urgent pointer)有效(见2 0 . 8节)。
- ACK: 确认序号有效, TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。
- PSH: 接收方应该尽快将这个报文段交给应用层。
- RST: 重建连接。
- SYN(SYNchronization):同步序号用来发起一个连接,在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
- FIN: 发端完成发送任务,用来释放一个连接当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
**需要注意的是: **
(1)不要将确认序号Ack与标志位中的ACK搞混了。
(2)确认方Ack=发起方Req+1,两端配对。
TCP连接的三次握手的过程(客户端我们用A表示,服务器端用B表示)
前提:A主动打开,B被动打开
三次握手的过程.png- 在建立连接之前,B先创建TCB(传输控制块),准备接受客户进程的连接请求,处于LISTEN(监听)状态;
- A首先创建TCB,然后向B发出连接请求,SYN置1,同时选择初始序号seq=client_ISN,进入SYN-SEND(同步已发送)状态;
- B收到连接请求后向A发送确认,SYN置1,ACK置1,同时产生一个确认序号ack=client_ISN+1。同时随机选择初始序号seq=server_ISN,进入SYN-RCVD(同步收到)状态;
- A收到确认连接请求后,ACK置1,确认号ack=server_ISN+1,seq=client_ISN+1,进入到ESTABLISHED(已建立连接)状态。向B发出确认连接,最后B也进入到ESTABLISHED(已建立连接)状态。
简单来说,就是
- 首先由Client发出请求连接即 SYN=1,ACK=0, TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=client_ISN
- 然后Server进行回复确认,即 SYN=1,ACK=1, seq=server_ISN, Ack=client_ISN+1,
- 最后Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=client_ISN+1, Ack=server_ISN+1.
确认应答信号Ack = 收到的seq + 1。 连接建立中,同步信号SYN始终为1。连接建立后,同步信号SYN=0。
当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN(初始序号)随时间而变化,因此每个连接都将具有不同的ISN。RFC 793 [Postel1981c]指出ISN可看作是一个3 2比特的计数器,每4 m s加1。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它作错误的解释。
TCP断开的四次握手的过程
四次握手的过程.png- 客户端A发送一个FIN,用来关闭A到B的数据传送,A进入FIN_WAIT_1状态;
- 服务端B收到FIN后,发送一个ACK给A,确认序号为序号+1,B进入CLOSED_WAIT状态;
- B发送一个FIN,用来关闭B到A的数据传送,B进入LAST_ACK状态;
- A收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给B,确认序号为序号+1,B进入CLOSED状态,完成四次握手。
注意:中断连接端可以是Client端,也可以是Server端。
整个过程Client端所经历的状态如下:
Client端所经历的状态.png整个过程Server端所经历的过程如下:
Server端所经历的过程.png
TCP优点:
1.可靠稳定;
2.传递数据前,有三次握手连接;
3.传递数据是,有确认、窗口、重传、拥塞控制;
4.传递数据后,会断开连接节省系统资源。
TCP缺点:
1.传输慢,效率低,占用系统资源高;
2.传递数据前,需要连接耗时;
3.传递数据时,确认、重传、拥塞控制等会消耗大量时间及CPU和内存等硬件资源;
4.容易受到攻击,如“SYN攻击”这样典型的DDOS攻击。
问题:
1.为什么A还要发送一次确认?
这主要是防止已失效的连接请求报文段突然又传送到B,因而产生错误。比如:A发送一个连接请求,但由于连接请求的报文丢失了而未收到B发过来的确认。因此,A再发一次请求,后来接到B的确认,建立了连接。数据传输完毕后,就释放连接。
2.避免SYN攻击
在三次握手连接中,Server发送SYN-ACK之后,等待Client的ACK之前的TCP连接称为半连接(half-open-connect),此时Server处于SYN_RCVD状态,当收到Client的ACK后,Server转入ESTABLISH状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,向Server发送大量的SYN包,Server发送确认包,并等待Client的确认,由于源地址不存在,Server不断重新发送直至超时,这些伪造的SYN包长时间占据未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时常见的DDOS攻击,检测SYN攻击就是检测Server是否有大量半连接状态且源IP地址是随机的则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
$ netstat -nap | grep SYN_RECV
3.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
4.为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到Server端所有的报文都发送完了,才能发送FIN报文,因此不能一起发送。故需要四步握手。
5.如何保证接收的顺序性?
TCP使用(ISN)初试序号seq和确认序号Ack机制保证了顺序性TCP的每个报文都是有序号的,确认序号Ack=seq+1;