网络
TCP/IP协议族
ARP:IP地址和物理地址的转换
1 | Type 0x800:ip |
arp -a
查看arpcache
ICMP:测试网络,实际上是IP协议的一部分,由每一个IP协议模块实现,包含8位type、8位code、16RCR和32位content
一般type只用到
- Destination Unreachable Message
1 | Type 3 |
- Redirect Message
1 | Type 5 |
- Echo or Echo Reply Message
1 | Type |
**DNS: **客户端使用DNS协议查询目标主机IP
1 | cat /etc/resolv.conf # dns server ip |
上层协议通过封装使用下层协议服务
通过分用向应用传递
以太网帧:
MTU=1500
Type:
- 0x800 : ip
- 0x806 : arp
- 0x835 : rarp
IP协议
无状态(UDP、HTTP)、无连接、不可靠的服务
IP分片:数据报标识、标志和片偏移
- 所有数据用于相同标识值
- 保留位|DF(禁止分片)|MF(更多分片)
- 实际偏移 off<<3,因此每个分片都是8的整数倍
何时分片:20 ipv4_header+1480 ipv4_dgrm
路由:
1 | route # 查看路由表 |
TCP协议
面向连接,可靠传输、基于字节流
可靠传输保证:
应答机制:每个TCP报文段必须得到回答,seqno和ackno
超时重传:定时重传未应答的报文段
重组器:保证TCP报文段有序
UDP和IP则有上层协议处理数据确认和超时重传
URG:紧急指针
PSH:立即从接收缓存区读数据
RST:复位报文,重连??会不会丢掉数据呢,我在cs144设置流erro
TCP选项
kind=3:窗口扩大因子:N<<M[0, 14]
cat /proc/sys/net/ipv4/tcp_window_scaling
kind=4,5:SACK:选择性确认,只发丢失报文,边沿块8字节
cat /proc/sys/net/ipv4/tcp_sack
半关闭状态:
发送FIN关闭数据写,继续数据接收
收到结束报文关闭连接
超时重传
发送六次,TIMEO指数增长
1 | ➜ ~ cat /proc/sys/net/ipv4/tcp_syn_retries |
TCP状态转移
客户端:
- connect发送SYN,进入SYN_SENT
- 调用close或shutdown发送SYN。进入FIN_WAIT_1
孤儿连接:应用关闭并且处于主机FIN_WAIT_2状态
TIME_WAIT状态:等待2MSL(TCP最大生存时间)才能完全关闭
RFC 1122建议MSL=2min
- 可靠终止TCP连接:确保收FIN、ACK,否则发送复位报文
- 保证迟来的TCP被丢弃而不会进入下一个新的化身,因为端口无法被打开两次,这样保证了不会影响下一次连接
通过SO_REUSEADDR选项强制关闭
服务端:
- listen进入LISTEN状态
- 收入到SYN放入内核等待队列,同时发送SYN,ACK进入SYN_RCVD状态
- 收到ACK进入ESTABLISHED,双方能数据交互了
- 收到FIN进入CLOSE_WAIT,等待服务器应用关闭
- 发送FIN进入LAST_ACK
- 收到ACK关闭连接
复位报文:
当请求连接端口处于TIME_WAit,客户端将收到RST
通过SO_LINGER发送RST异常终止
半连接状态会收到RST
TCP数据流
- 交互数据:包含很少字节,实时性要求高,telnet、ssh
- 成块数据:通常位MTU,要求传输效率,ftp
Nagle算法:双方通信任意时刻最多发送一个未被确认的TCP报文段,自适应性:确认越快,发送越快
带外数据
总是立即被发送,TCP利用紧急指针实现带外数据
紧急指针指向最后一个带外数据的下一个字节
OOB被放入带外缓存,SO_OOBINLINE使其放入TCP接收缓存
TCP超时重传
默认最少3次重传底层IP和ARP开始接管
默认TCO重传15次
1 | ➜ ~ cat /proc/sys/net/ipv4/tcp_retries1 |
拥塞控制:控制SWND变量
看到用了cubic算法
1 | ➜ ~ cat /proc/sys/net/ipv4/tcp_congestion_control |
慢启动+拥塞避免:
CWND初始值为2~4个SMSS
CWND+=min(N,SMSS)N指此次确认包含的,之前未被确认的字节数
超过慢启动门限(ssthresh),线性增加
每个RTT时间重新计算
或每收到对新数据的确认报文段就更新:CWND+=SMSS*SMSS/CWND
倘若是传输超时,政策不变:
ssthresh=max(FlightSize/2, 2*SMSS)
CWMD<=SMSS
快速重传+快速恢复:
若接收3个重复确认报文:ssthresh=max(FlightSize/2, 2* SMSS), CWND=ssthresh+3*SMSS
每收到1个重复确认时,CWND=CWND+SMSS
收到新数据确认时,CWND=ssthresh
通信案例
HTTP代理服务器:
正向代理:
设置环境变量http_proxy,任务http请求都将由代理服务器代理
export http_proxy="host:port"
方向代理:
服务器转发请求到内部网络进行代理并返回
透明代理:
只能设置在网关上,数据必然经过网关
部署squid代理:
1 | acl localnet src xxx/x |
HTTP请求
1 | GET http://www.baidu.com/index.html HTTP/1.0 |
GET、HEAD、OPTIONS、TRACE、PUT和DELETE等方法时等幂的,POST多次发送则影响服务器资源
linux提供HEAD、GET、POST来快速测试Web服务器
HTTP应答
1 | HTTP/1.0 200 OK |
使用cookie保存状态,“BAIDUID”指定Cookie的名 字,“expires”指定Cookie的生存时间,“domain”和“path”指定该Cookie 生效的域名和路径
这里每行都要\r\n,空行只包含\r\n