文章目录
1、TCP/IP网络模型
OSI七层网络模型:自下而上分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP网络模型分为4层,自下而上分别为:
- 链路层:
- 对应OSI的物理层、数据链路层;
- 处理数据在媒介上的表示、传输以及与硬件交互的细节。
- 网络层:
- IP层负责IP数据报的路由转发,所有的TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。
- 网络层(IP)提供了一种尽力而为、无连接、不可靠的数据报交付服务,IP负责将IP数据报(又叫分组),放入数据链路层传输,负责分片和重组逻辑。
- 传输层:
- 为端主机上运行的应用程序提供端到端服务,包括TCP和UDP。
- TCP提供了带流量控制、拥塞控制、有序、可靠的流交付,TCP需要处理丢包检测重传、重排序等IP层不处理的问题,TCP面向连接,不保留消息边界;
- 而UDP提供的功能基本上没有超越IP,不提供速率控制和差错控制,不保证可靠性,UDP只是提供一套端口号,用于复用、多路分解(即把收到的UDP数据报交给应用层对应程序处理)和校验数据完整性(只检错不纠错),UDP面向非连接,保留消息边界。
- 应用层:
- 对应OSI的会话层、表示层、应用层;
- 负责处理特定应用的细节,通常应用的实现都是基于TCP/IP或者UDP/IP,具体如HTTP、FTP、DNS、SSH协议等。
- 应用层与应用细节相关,与网络数据传输无关,而之下的三层(链路层、网络层、传输层)则对应用一无所知,但需要处理通信的细节。
1.1、IP协议
IP是TCP/IP协议族中的核心协议,为传输层提供IP数据报的交付能力,它负责将IP数据报从网络一端传递到另一端,实现数据转发。IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。
发送端:接收来自传输层协议的数据单元(PDU),添加IP首部封装为IP数据报,交给下一层链路层协议。
接收端:接收来自链路层的PDU,去掉IP首部,根据首部的协议类型,将数据分发给上一层传输层的TCP、UDP或者其他协议。
IP主要包含三方面内容:IP编址方案、分组封装格式及分组转发规则。
- 路由器:
工作于网络层,是IP层的核心设备,实现传输层之下的所有层。路由器有两个或两个以上的网络接口,用于连接两个或多个网络,负责将IP数据报(分组)从一个网络接口转发到另一个网络接口,带有多网络接口(网卡)的主机也能承担转发分组的功能,这种主机称为作为路由器使用的主机。
- IP协议格式:
- IP数据报应该是包括
- IP首部:其前20字节是所有IP分组必须具有的,
- 4位协议版本号字段:区分IPv4、IPv6;
- 4位首部长度:表示IP首部长度。最大数值是15 * 4个字节;
- 8位服务类型:
- 16位总长度:
- 16位标识:
- 3位标志字段:
- 13位分片偏移:
- 8位生存时间TTL:
- 8位协议字段:区分数据报承载TCP、UDP等哪种协议;
- 16位头部校验和。
- 32位源IP地址:
- 32位目的IP地址;
- 选项字段:最多40字节;
- 数据负载
- 不透明的负载(Payload)来自于TCP、UDP或者其他,对于IP层透明,无须解释。
- IP首部:其前20字节是所有IP分组必须具有的,
- IP数据报应该是包括
- IP协议转发流程:仅从网络层分析:
- A发出目的地址为C的IP数据报,查询路由发现下一跳为E
- A将数据报发送给E
- E查询路由表发现下一跳为F,将数据报发送给F
- F查询路由表发现目的地C直接连接,将数据发送给C
1.2、TCP协议
传输控制协议:提供面向连接、可靠、有序、字节流传输服务。TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
-
三次握手过程:在正式使用之前,先要检测网络是否通畅,具体过程:
- 客户端准备建立TCP连接时,向服务端发出连接请求报文段(首部中同步位SYN=1,初始序号seq=x)。这时,客户端TCP进程进入SYN-SENT(同步已发送)状态。
- 服务端收到连接请求报文段后,如果同意建立连接,则向客户端发送确认报文段(同部位SYN=1,确认位ACK=1,确认号ack=x+1,初始序号seq=y)。这时,TCP服务端进入SYN-RCVD(同步收到)状态。
- 客户端收到服务端的确认后,还要向服务端发送确认报文段(确认位ACK=1,确认号ack=y+1,序号seq=x+1)。A进入ESTABLISHED(已建立连接)状态。
- B收到A的确认后,也进入ESTABLISHED状态。
总结:请求连接则置同步位SYN=1,确认连接就置确认位ACK=1(TCP规定,SYN报文段不能携带数据,但要消耗一个序号;ACK报文段可以携带数据,但如果不携带数据则不消耗序号)。
-
四次挥手过程:挥手就是断开连接的过程,具体过程:
- A的应用进程先向B发送连接释放报文段(终止控制位FIN=1,序号seq=u),并停止发送数据,进入FIN-WAIT-1(终止等待1)状态。
- B收到连接释放报文段后即发出确认报文段(确认位ACK=1,序号seq=v,确认号ack=u+1),然后B进入CLOSE-WAIT(关闭等待)状态。此时A到B方向的连接已经释放,B若要发送数据,A仍要接收。
- A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
- B若没有要向A发送的数据了,就发送连接释放报文段(终止位FIN=1,序号seq=w,确认号ack=u+1),然后B就进入LAST-ACK(最后确认)状态,等待A的确认。
- A收到B的连接释放报文段后,必须对此发出确认(ACK=1,ack=w+1,seq=u+1)。然后进入TIME-WAIT(时间等待)状态。此时,TCP连接还没有释放掉。必须经过2倍最长报文段寿命(MSL)时间后(通常MSL=2分钟,保证A发送的最后一个ACK报文段能够到达B,防止“已失效的连接请求报文段”出现在本连接中),TCP连接结束。
总结:请求释放连接则置FIN=1,确认释放则置ACK=1。
-
保活计时器:
- 客户端主机出现故障时,服务器会白白等待下去。为此需要设置保活计时器。服务器每收到一次客户的数据&#