【网络】TCP\IP知识汇总
1.OSI模型个TCP/IP模型区别
2.Unix以及类Unix操作系统演变
3.SSH协议(安全外壳协议)
通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。
使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。
SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的"通道"
两种验证方式:
基于口令:利用账号和口令 登录远程主机,与服务器传输数据,数据是加密的,但不保证服务器不被中间人替代。
基于密钥:你生成一对密钥,一个放在服务器,一个在自己这,连接SSH服务器时,需要服务器比较你的密钥。
SSH三层协议:
SSH-TRANS传输层协议
SSH-AUTH用户认证协议
SSH-CONN连接协议
4.套接字四元组
(源ip 源端口,目的ip 目的端口)
5.保留网段:
IPv4协议中有三段不会被公网使用,留在内部网络使用
6.域名分类及DNS分类
7.子网掩码是什么?
子网掩码它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。
子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分
(子网掩码的网络位全为1 比如255.255.255.0)
8.子网掩码的作用:
将子网掩码取反,然后与本机ip地址进行与运算,得出两台主机是否在一个子网内。
分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在局域网上,还是在广域网上。
子网掩码一般用于将网络进一步划分为若干子网,以避免主机过多而拥堵或过少而IP浪费。
例如:设IP地址为192.168.10.2,子网掩码为255.255.255.240,那么子网掩码是怎样来区分网络地址和主机地址的呢。
主机地址为:0.0.0.2(将掩码取反,然后与运算)
9.TCP与UDP的套接字的区别
TCP,又被叫做字节流套接字(Stream Socket),UDP也有一个类似的叫法, 数据报套接字(Datagram Socket),
一般分别以“SOCK_STREAM”与“SOCK_DGRAM”分别来表示TCP和UDP套接字。
10.socket流程
服务器初始化过程:首先初始化socket,之后服务器端需要执行bind函数,将自己的服务能力绑定在一个众所周知的地址和端口上,
紧接着,服务器端执行listen操作,将原先的socket转化为服务端的socket,服务端最后阻塞在accept上等待客户端请求的到来。
客户端初始化过程:客户端需要先初始化socket,再执行connect向服务器端的地址和端口发起连接请求
三次握手:
一旦连接建立,数据的传输就不再是单向的,而是双向的,这也是TCP的一个显著特性。
11.socket结构体
通用套接字
struct sockaddr{ sa_family_t sa_family; /* 地址族. 16-bit*/ char sa_data[14]; /* 具体的地址值 112-bit */ };
地址族的三种情况(本地 IPV4 IPV6)
IPV4套接字
/* 描述IPV4的套接字地址格式 */ struct sockaddr_in { sa_family_t sin_family; /* 16-bit */ in_port_t sin_port; /* 端口口 16-bit*/ struct in_addr sin_addr; /* Internet address. 32-bit */ /* 这里仅仅用作占位符,不做实际用处 */ unsigned char sin_zero[8]; };
端口号 这里是16bit.。ipv4的地址是2的16次方。
sin_family就是上面所说的IPV4对应的 AF_INET
IPV6套接字
struct sockaddr_in6 { sa_family_t sin6_family; /* 16-bit */ in_port_t sin6_port; /* 传输端口号 # 16-bit */ uint32_t sin6_flowinfo; /* IPv6流控信息 32-bit*/ struct in6_addr sin6_addr; /* IPv6地址128-bit */ uint32_t sin6_scope_id; /* IPv6域ID 32-bit */ };
地址族显然应该是AF_INET6,端口同IPv4地址一样16bit,关键的地址从32位升级到128位
12.三次握手过程:
- 客户端的协议栈向服务器端发送了SYN包,并告诉服务器端当前发送序列号j,客户端进入SYNC_SENT状态;
- 服务器端的协议栈收到这个包之后,和客户端进行ACK应答,应答的值为j+1,表示对SYN包j的确认,同时服务器也发送一个SYN包,告诉客户端当前我的发送序列号为k,服务器端进入SYNC_RCVD状态;
- 客户端协议栈收到ACK之后,使得应用程序从connect调用返回,表示客户端到服务器端的单向连接建立成功,客户端的状态为ESTABLISHED,同时客户端协议栈也会对服务器端的SYN包进行应答,应答数据为k+1;
- 应答包到达服务器端后,服务器端协议栈使得accept阻塞调用返回,这个时候服务器端到客户端的单向连接也建立成功,服务器端也进入ESTABLISHED状态
13.TCP\UDP的区别
TCP 是一个面向连接的协议,TCP 在 IP 报文的基础上,增加了诸如重传、确认、有序传输、拥塞控制等能力,通信的双方是在一个确定的上下文中工作的。
而 UDP 则不同,UDP 没有这样一个确定的上下文,它是一个不可靠的通信协议,没有重传和确认,没有有序控制,也没有拥塞控制。我们可以简单地理解为,在 IP 报文的基础上,UDP 增加的能力有限。
UDP 不保证报文的有效传递,不保证报文的有序,也就是说使用 UDP 的时候,我们需要做好丢包、重传、报文组装等工作。
DNS服务就是基于UDP的。
14.本地套接字是 IPC,也就是本地进程间通信的一种实现方式。除了本地套接字以外,其它技术,诸如管道、共享消息队列等也是进程间通信的常用方法,但因为本地套接字开发便捷,接受度高,所以普遍适用于在同一台主机上进程间通信的各种场景。
15.本地套接字
本地套接字是一种特殊类型的套接字,和 TCP/UDP 套接字不同。TCP/UDP 即使在本地地址通信,也要走系统网络协议栈,
而本地套接字,严格意义上说提供了一种单主机跨进程间调用的手段,减少了协议栈实现的复杂度,效率比 TCP/UDP 套接字都要高许多。类似的 IPC 机制还有 UNIX 管道、共享内存和 RPC 调用等。
16.ping指令和ICMP
ping 是基于一种叫做 ICMP 的协议开发的,ICMP 又是一种基于 IP 协议的控制协议,翻译为网际控制协议。
17.四次挥手
最长分节生命期 MSL(maximum segment lifetime)的两倍,一般称之为 2MSL
只有发起连接终止的一方会进入 TIME_WAIT 状态
TIME-WAIT的作用:
(1)为了确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。如果ACK丢失了,服务器重传FIN,状态为closed,服务器关闭出错。
(2)和连接“化身”和报文迷走有关系,为了让旧连接的重复分节在网络中自然消失。如果有一个新的tcp连接拥有相同的套接字四元组,则会认为是一个连接。
2MSL的作用:
经过 2MSL 这个时间,足以让两个方向上的分组都被丢弃,使得原来连接的分组在网络中都自然消失,再出现的分组一定都是新化身所产生的。
TIME-WAIT的危害:
资源占用、端口占用
18.在绝大数情况下,TCP 连接都是先关闭一个方向,此时另外一个方向还是可以正常进行数据传输
19.流量控制和生产者 - 消费者模型(单个TCP连接的控制)
发送窗口和接收窗口是 TCP 连接的双方,一个作为生产者,一个作为消费者,为了达到一致协同的生产 - 消费速率、而产生的算法模型实现。
说白了,作为 TCP 发送端,也就是生产者,不能忽略 TCP 的接收端,也就是消费者的实际状况,不管不顾地把数据包都传送过来。如果都传送过来,消费者来不及消费,必然会丢弃;而丢弃反过使得生产者又重传,发送更多的数据包,最后导致网络崩溃。
20.拥塞控制(多个 TCP 连接共享带宽的拥塞控制模型)
TCP 就必须考虑多个连接共享在有限的带宽上,兼顾效率和公平性的控制,这就是拥塞控制的本质。
在 TCP 协议中,拥塞控制是通过拥塞窗口来完成的,拥塞窗口的大小会随着网络状况实时调整。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步