计算机网络连接是指连接两台或多台计算设备(如台式计算机、移动设备、路由器或应用程序)以实现信息与资源的传输和交换的流程。
现在最常用的 以太网 是物理上使用星形拓扑(有一个路由器或集线器作为中心), 逻辑上使用总线拓扑(使用CSMA/CD的总线技术)
time ## 其它 ### 带宽 和 宽带 和 位宽 的联系与区别
带宽(Bandwidth)
bit per second
位 每 秒
每秒能传输的位,或者叫做 比特每秒 每秒能传输的比特
代理 proxy
「代为处理」
代理的类型和作用域
在各种系统上的代理设置
windows
linux
安卓
正向代理/转发代理 forward proxy
反向代理 reverse proxy
网关 gateway
「网络关口」「网络海关」
隧道 tunnel
端口转发 port forwarding
虚拟专用网 (Virtual Private Network , VPN)
虚拟私有云 (Virtual Private Cloud , VPC)
透明 transparent
<!--
一般情况下如何配置ip
ip地址 子网掩码 网关 dns
两台电脑通过网线直连的情况下 ip 要怎么配置?
三台电脑只有集线器的情况下 ip 要怎么配置?
如何实现一个web服务器
拓扑结构
星型
环型
总线
以太网
...
模型
七层模型 (由 OSI 提出的)
应用层 Application
表示层 Presentation
负责转化数据格式,并处理数据加密和数据压缩。
其实 tls 这这种协议可以归类到这一层里
会话层 Session
主要是用来管理网络设备的会话连接,建立会话,保持会话,断开会话
传输层 Transport
网际层 Internet/Network
数据链路层 Link/Data link/Network interface
物理层 Hardware/Physical
四层模型 ip/tcp
应用层
传输层
网际层
网络接口层
五层模型
应用层 -> data (数据)
传输层 ->
TCP -> segment (段)
UDP -> datagram (数据报文)
网际层 -> packet (包)
数据链路层 -> frame (帧)
物理层 -> bit (比特)
各层常用的协议
应用层
http
0.9 1.0 1.1 2 3
mqtt
telnet
rfc 97 137 153 318
854 855 856 857 859 860 861
2217
ftp
dns
nntp
网络新闻传输协议(Network News Transfer Protocol)
USENET 和 NNTP 的关系,大概就是 网站 和 http 的关系差不多
irc
xmpp
ntp (Network Time Protocol) 网络时间协议
PTP (Precision Time Protocol) 精确时间协议
dhcp
DHCP(Dynamic Host Configuration Protocol)动态主机配置协议
DHCP 是基于客户端-服务器模式的标准协议,由RFC 2131定义
它允许服务器集中管理IP地址池,自动为网络中的主机(如计算机、手机等)分配临时或永久的IP地址及相关配置
服务器控制一段IP地址范围(地址池),客户端接入网络时自动获取IP地址、子网掩码、网关和DNS服务器等信息
DHCP采用四步交互流程(DORA模型)完成地址分配:
Discover :客户端广播请求,寻找可用的DHCP服务器。
客户端在未获得 IP 地址时,会通过 UDP 广播 (目标地址 255.255.255.255 或子网广播地址)发送 DHCP Discover 消息,寻找可用的 DHCP 服务器。
此时客户端完全不知道服务器的存在,因此使用广播确保消息能被同一链路中的所有设备(包括潜在的 DHCP 服务器)接收。
Offer :服务器响应并提供IP地址及相关配置。
Request :客户端正式请求使用提供的地址。
Acknowledge :服务器确认分配,完成绑定
DHCP客户端和服务器通过UDP端口68(客户端)和67(服务器)通信
WHOIS
RDAP (Registration Data Access Protocol, 注册数据访问协议)
smtp
pop3
imap
echo
discard
daytime
chargen
time
传输层
tcp
建立连接 三次握手
客户端 -> 服务端 syn
服务端 -> 客户端 syn+ack
客户端 -> 服务端 ack
为什么是三次握手?
如果是两次握手会有什么问题?
断开连接 四次挥手
主动关闭 -> 被动关闭 fin
被动关闭 -> 主动关闭 ack
被动关闭 -> 主动关闭 fin
主动关闭 -> 被动关闭 ack
主动关闭的那一边,在发送 ack 后还会等待 2msl 才会进入 closed 状态
被动关闭的那一边,在收到 ack 后就会立即进入 closed 状态
多数情况下都是客户端主动关闭的
为什么是四次握手?
如果少于四次握手会有什么问题?
为什么发送 ack 后还要等待 2msl 才会进入 closed 状态?
状态
LISTEN SYN-SENT SYN-RECEIVED
ESTABLISHED
FIN-WAIT-1 FIN-WAIT-2 CLOSE-WAIT LAST-ACK TIME-WAIT CLOSED
标志符
syn ack fin rst
发送 rest ,会立即释放连接,会丢弃发送缓冲区和接收缓冲区的数据,不需要等待对方ack确认
流量控制
滑动窗口
拥堵控制
慢启动 与 拥塞避免
TCP 慢启动 / 14KB 规则 ?
快重传 与 快恢复
三个半事件
连接建立
连接断开
消息到达
消息发送完毕(这是半个事件)
沾包
根本原因
什么情况下会发生
解决方式
为什么udp没有沾包
tcp的异常中断
程序崩溃
操作系统会代为发送四次挥手
主机宕机
没有重启
发送端在发送数据等待ack超时后,会强制关闭连接
有重启
接收端回复 rest 报文,然后重新建立连接
还要考虑 KeepAlive ?
可以参考主机宕机的情况
如果发送端一直没有发送数据,且没有keepalive,且应用层没有心跳,那么发送端的连接会一直保持,会浪费一点内存
其实只要重启的速度足够快,且 连接的socket 重新载入内存里,那么另一侧是不会感受到连接中断过的
如果客户端的ip有变化,例如 手机网络经过切换
那么,服务端会返回一个 rest ,然后重新建立连接
如果客户端访问服务端没有开放的端口
服务端可能会丢弃客户端的请求,然后客户端等待超时后自己关闭连接
服务端也可能直接返回 rest 包
这种请求也有可能被前面的防火墙挡下来了,根本到不了监听端口的服务端程序
udp
udp 协议是无连接的,不需要握手建立连接,数据发送后,服务器端不会返回确认信息
udp 的数据包发出去就不管的了,没有握手,挥手,ack
也可以在应用层里实现 tcp 的那套可靠传输机制
icmp
ping traceroute/tracert
网际层
ip v4 v6
ARP
ARP inARP GARP RARP
IPsec
数据链路层
以太网 (Ethernet)
以太网帧又分为 Ethernet II 和 IEEE 802.3
关注 Ethernet II 就可以了
帧间隙 来区分不同的 帧
各层对应的硬件
网关 (gateway)
路由器 (route)
交换器/交换机 (switch)
桥接器/网桥 (network bridge)
集线器 (ethernet hub 又或者 简称 hub)
中继器 (repeater)
调制解调器 (modem modulator-demodulator 调制器-解调器)
和安全相关的硬件
IPS (Intrusion Prevention System) 入侵检测(旁路部署)
IDS (Intrusion Detection System) 入侵防御(串行部署)
FW (FireWall) 防火墙
WAF (Web Application FireWall) 网页应用防火墙
UTM (Unified Threat Management) 统一威胁管理
按照规模划分的网络类型
pan
lan
vlan
wlan
can
man
wan
更多
ban
san
han
ran
Backbone
ipx
从两个计算机直连到广域网
载波侦听多路访问
Carrier Sense Multiple Access CSMA
载波侦听多路访问/碰撞检测(CSMA/CD)
CSMA with Collision Detection
载波侦听多路访问/碰撞避免(CSMA/CA)
CSMA with Collision Avoidance
路由表和路由算法
静态路由
动态路由
迪达拉算法
距离向量路由协议(Distance Vector Routing Protocol):
RIP(Routing Information Protocol)和IGRP(Interior Gateway Routing Protocol),它们使用跳数作为衡量指标。
链路状态路由协议(Link State Routing Protocol):
OSPF(Open Shortest Path First)和IS-IS(Intermediate System to Intermediate System),它们通过交换链路状态信息来构建网络拓扑图。
tcp 和 udp
什么是socket
socket 的中文翻译是套接字
network socket 网络套接字
五元组(five-element tuple): 源地址 源端口 目标地址 目标端口 传输层协议
一个五元组,优惠称为套接字对(socket pairs)
SOCK_DGRAM 数据报套接字 用在UDP
SOCK_STREAM 流套接字 用在TCP
SOCK_RAW 原始套接字 除了UDP和TCP之外的传输层协议,例如 icmp
从socket里读写内容
一些限制
输入输出只考虑 asni ,多字节编码不好处理,这里只关注网络连接
一次通讯数据包最大的长度为 255 ,因为分包操作也挺麻烦的
基本套路
建立连接
socket
setsockopt
服务端
bind
listen
accept
客户端
connect
发送和接收数据
read / write -> 通用的文件描述符操作函数
recv / send -> TCP
recvfrom / sendto -> UDP
关闭连接
shutdown -> 一般只用于socket
可以选择关闭读 关闭写 关闭读写,调用后 socket 就会关闭
close -> 通用的文件描述符操作函数
调用后无法读写,但 socket 未必会关闭,
调用后 socket 的引用计数会减1,只有当 socket 的引用计数为0时才会关闭连接
比较保险的方式是先调用 shutdown 再调用 close
io复用
select poll epoll
只输出一个 helloworld
能接收多次连接的 helloworld
能同时接收多个连接的 helloworld
实现最简单的五个协议
echo (RFC 862) 7 回显服务,把收到的数据发回客户端
discard (RFC 863) 9 丢弃所有收到的数据
chargen (RFC 864) 19 服务端 accept 连接之后,不停地发送测试数据
daytime (RFC 867) 13 务端 accept 连接之后,以字符串形式发送当前时间,然后主动断开连接
time (RFC 868) 87 服务端 accept 连接之后,以二进制形式发送当前时间的32位时间戳,然后主动断开连接
只考虑 tcp 的
用 netcat 作为客户端
然后是基于 telnet 的 echo
然后是基于 telnet 的聊天室
nc telnet http proxy
http 服务器
http 协议
0.9 1.0 1.1 2 3
请求码 和 响应码
mime
缓存
基本套路
建立连接
接收数据
解释请求
请求行
请求头
请求体
处理数据
构造响应
响应行
响应头
响应体
输出响应
根据实际情况决定 关闭连接 或 保持连接
进程模型
单进程单线程
单进程多线程
多进程单线程
多进程多线程
io 多路复用
select
poll
epoll
水平触发 (level trigger, LT)
边缘触发 (edge trigger, ET)
具体类型
静态
动态
cgi
fastcgi
代理
socket 双写
位置
反向代理
正向代理
类型
http代理
RFC 2616 7230 7231 7235
sockt代理
RFC 1928 SOCKS5
pac
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Proxy_servers_and_tunneling
websocket
WebSocket Secure (wss)
相关的rfc
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Resources_and_specifications
认证 和 授权
流量控制
TLS
1.2
1.3
OpenNIC
OpenNIC(或称OpenNIC Project)是由用户所有和控制的[1][2]顶级域名的域名注册局,其提供类似ICANN的传统顶级域名的非国家性替代。
这里的域名往往会被用在 暗网 和 深网
tor (The Onion Router) 洋葱路由
i2p (Invisible Internet Project) 隐形的 互联网 项目
tor i2p 和 OpenNIC的域名,这三个通常会配合地使用
表网 -> 表层网络 Surface Web
深网 -> 深层网络 Deep web
暗网 -> 黑暗网络 Dark web
明网 -> Clearnet
虽然不是很严谨
能被搜索引擎收录的是 表网
不能被搜索引擎收录的是 深网
深网 包含 暗网
暗网是由深网的一小部分所构成的。
暗网一般需要特别的工具才能进入
和 暗网 相对的是明网
-->