TCP
TCP报文格式:
Source port(16)源端口
Destination port (16) 目的端口
Sequence number (32):序列号
Acknowledgement number (32):确认号
Header length (4):头部长度
Reserved (6):保留,必须填0,长度为6比特
Control bits (6):控制位。包含FIN、ACK、SYN、URG、PSH、RST等标志位,代表不同状态下的TCP数据段。
Window (16):窗口TCP的流量控制,这个值表明当前接收端可接受的最大的数据总数(以字节为单位)。窗口最大为65535字节。长度为16比特。
Checksum (16):校验和。
Urgent (16):紧急指针,当URG标志为1时才有效。
Options:选项字段,长度为0-40字节,可扩充TCP长度。决定TCP最长长度,为60字节。
Data (varies)
TCP的序列号和确认号:
序列号seq:TCP通信过程中某一个传输方向上的字节流的每个字节的序号,通过这个来确认发送的数据有序,比如现在序列号为a,下个序列号就是a+1
确认号ack:TCP对上一次seq序号做出的确认号,用来响应TCP报文段,给收到的TCP报文段的序号seq加1。带SYN和FIN的,确认号在序列号基础上+1
TCP的标志位:
- SYN:简写为S,同步标志位,用于建立会话连接,同步序列号;
- ACK: 简写为.,确认标志位,对已接收的数据包进行确认;
- FIN: 简写为F,完成标志位,表示我已经没有数据要发送了,即将关闭连接;
- PSH:简写为P,推送标志位,表示该数据包被对方接收后应立即交给上层应用,而不在缓冲区排队;
- RST:简写为R,重置标志位,用于连接复位、拒绝错误和非法的数据包;
- URG:简写为U,紧急标志位,表示数据包的紧急指针域有效,用来保证连接不被阻断,并督促中间设备尽快处理;
TCP三次握手建立连接:
- 第一次握手:
PC1将TCP报文标志位SYN置为1,随机产生一个序号值seq=a,保存在TCP首部的序列号(Sequence Number)字段里,因为没收到过来自PC2的任何报文,所以确认序列号为0 ;指明PC1打算连接的PC2的端口,并将该数据包发送给PC2,发送完毕后,PC1进入SYN_SENT状态,等待PC2确认。
- 第二次握手:
初始序列号b为一个随机生成的数字,同时因为此报文是回复给PC1的报文,所以确认序列号为a+1;PC2收到数据包后由标志位SYN=1知道PC1请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=a+1,随机产生一个序号值seq=b,并将该数据包发送给PC1以确认连接请求,PC2进入SYN_RCVD状态。
- 第三次握手:
PC1接收到PC2发送的SYN和ACK置位的TCP报文后,回复一个ACK置位的报文,此时序列号为a+1,确认号为b+1。PC2收到之后,TCP双向连接建立。
- 注意:我们上面写的ack和ACK,不是同一个概念:
- 小写的ack代表的是头部的确认号Acknowledge number, 缩写ack,是对上一个包的序号进行确认的号,ack=seq+1。
- 大写的ACK,则是我们上面说的TCP首部的标志位,用于标志的TCP包是否对上一个包进行了确认操作,如果确认了,则把ACK标志位设置成1。
我们看下实战中TCP的三次握手过程:
- 第一次握手,客户端51323端口号向服务器端80号端口发起连接,此时标志位flags=S,即SYN=1标志,表示向服务端发起连接的请求,同时生成序列号seq=84689409
- 第二次握手,服务端标志位flags=[S.],即SYN+ACK标志位设置为1,表示对上一个请求连接的报文进行确认,同时设置ack=seq+1=84689410,生成序列号seq=1893430205。
- 第三次握手,客户端对服务端的响应进行确认,所以此时标志位是[.]即ACK=1,同时返回对上一个报文的seq的确认号,ack=1893430206
TCP的数据传输的过程
PC1首先发送报文,seq=a+1,ack=b+1,载荷长度为12字节。
PC2收到后,对PC的报文回复确认报文,seq=b+1,ack=a+1+12,确认的是PC1发给PC2的报文序列号。
PC1收到后PC2的确认报文后,又给PC2发送一个报文,seq=a+1+12,ack=b+1,载荷长度为66字节。
PC2收到后,回复PC1确认报文,seq=b+1,ack=a+12+1+66。
TCP的四次挥手
- 由PC1发出一个FIN字段置”1 ”的不带数据的TCP段;
- PC2收到PC1发来的FIN置位的TCP报文后,会回复一个ACK置位的TCP报文。
- 若PC2也没有需要发送的数据,则直接发送FIN置位的TCP报文。假设此时PC2还有数据要发送,那么当PC2发送完这些数据之后会发送一个FIN置位的TCP报文去关闭连接。
- PC1收到FIN置位的TCP报文,回复ACK报文,TCP双向连接断开。
TCP滑动窗口机制
1. TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出,主要是根据网络情况动态调整窗口大小;
2. TCP将数据分段发送,确保发送的数据到达接收端也是正确的。利用的是“空洞”。TCP不会对每个数据包都返回ACK,而是累计返回的。
一文看懂TCP滑动窗口原理
https://zhuanlan.zhihu.com/p/571726228
UDP
不可靠的,无连接的。
Source Port:源端口,标识哪个应用程序发送。长度为16比特。
Destination Port:目的端口,标识哪个应用程序接收。长度为16比特。
Length:该字段指定UDP报头和数据总共占用的长度。可能的最小长度是8字节,因为UDP报头已经占用了8字节。由于这个字段的存在,UDP报文总长不可能超过65535字节(包括8字节的报头,和65527字节的数据)。
Checksum:覆盖UDP头部和UDP数据的校验和,长度为16比特。
ARP
是根据IP地址获取物理地址的一个TCP/IP协议。
ARP工作过程:
假设主机A和主机B是同网段。
- 主机A首先查看自己的ARP缓存表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
- 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
- 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
- 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。
ARP请求的目的MAC地址一开始为0,因为并不知道目的地址的MAC地址,而在传输ARP请求时,封装成帧后的MAC地址帧设成全F,表示这是一个广播包。因此ARP请求包的目的MAC地址是全0,封装成帧之后为全F。
ARP表
ARP表项分为ARP静态表和ARP动态表。
ARP静态表可以使用arp static ip地址 mac地址来设置,静态表没有老化时间。
ARP动态表的老化时间是20分钟,思科是5分钟。
免费ARP
免费ARP 地址冲突检测。
工作过程:
发送源IP,目的IP均为自己的ARP报文,如果没有收到arp响应,则不存在冲突;如果收到了arp响应,则表示该地址已被其他主机占用。
产生免费arp的场景:
- 主机手动配置IP地址时;
- DHCP服务器在分发地址的最后一个阶段,会发送免费arp探测该地址是否可用;
- VRRP在进行主备网关切换时需要发送免费ARP刷新下游设备的MAC表, 杜绝流量向错误的端口转发;
ICMP
报文由type、code等构成
Internet控制消息协议ICMP,是IP协议的辅助协议。
ICMP协议用来在网络设备间传递各种差错和控制信息,用于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。
ICMP消息封装在IP报文中,IP报文头部Protocol值为1时表示ICMP协议。
ping就是基于ICMP协议 ——Echo request type(8) code(0)
Echo reply type(0) code(0)
ICMP重定向
ICMP重定向报文是ICMP控制报文的一种。在特定的情况下,当路由器检测到一台机器使用非最优路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。
ICMP重定向过程:
1.主机A希望发送报文到服务器A,于是根据配置的默认网关地址向网关RTB发送报文。
2.网关RTB收到报文后,检查报文信息,发现报文应该转发到与源主机在同一网段的另一个网关设备RTA,此转发路径是更优的路径,所以RTB会向主机发送一个Redirect消息,通知主机直接向另一个网关RTA发送该报文。
3.主机收到Redirect消息后,会向RTA发送报文,然后RTA会将该报文再转发给服务器A。
ICMP差错检测
ICMP Echo消息常用于诊断和目的地之间的网络连通性,同时还可以提供其他消息,如报文往返时间等。
功能:Ping
ping是网络设备、Windows、Linux和Unix平台上的一个命令,其实是一个小巧而实用的应用程序,该应用基于ICMP协议。Ping常用于探测到达目的节点的网络可达性。
ICMP错误报告
ICMP定义了各种错误消息,用于诊断网络连接性问题;根据这些错误消息,源设备可以判断出数据传输失败的原因。如:当网络设备无法访问目标网络时,会自动发送ICMP目的不可达报文到发送端设备。
功能:Tracert
tracert基于报头中的TTL值来逐跳跟踪报文的转发路径。tracert是检测网络丢包和时延的有效手段,同时还可以发现网络中的路由环路。
Tracert
简单网络诊断工具,探测数据包从源地址到目的地址经过的路由器IP地址
1.进行tracert的主机或者设备(R1)最开始发送UDP包(源IP自己,目的IP目标,TTL=1,一个特殊的随机的端口号,一般很大)
2.R2收到R1发送的TTL为1的UDP包,TTL-1=0,则丢包并且ICMP马上向R1发送一个超时的报错包,并且在ICMP数据部分带上R2的接口IP地址,起始路由器收到TTL超时报错包后从ICMP数据种就探测到了下一跳IP地址
3.第二跳则发TTL=2的UDP包,可以探测到R1到R3的路径IP地址,R3则向R1发送超时包。
4.以此类推,但是到探测最后一跳时候,TTL=0,但是数据包已经到了目的地,这时候是不会有超时报错的,那么怎么判断是否到达目的地了呢?别忘了,我们的tracert包协带了特殊的端口号,而且一般很大,并且没发一个UDP则增长1,这么大的端口一般的设备都不会开启,那么在最后一跳虽然TTL不会超时报错,但是会有端口不可达的报错,所以最后三个报错包为端口不可达的ICMP报错包。
R1pingR6