TCP/IP协议族

image-20241118134533318

ARP:IP地址和物理地址的转换

image-20241118143441340

1
2
Type 0x800:ip
opt 1:request 2:reply 3: 4:

arp -a查看arpcache

ICMP:测试网络,实际上是IP协议的一部分,由每一个IP协议模块实现,包含8位type、8位code、16RCR和32位content

一般type只用到

  • Destination Unreachable Message
1
2
3
4
5
6
7
8
9
Type 3
Code
0 = net unreachable;
1 = host unreachable;
2 = protocol unreachable;
3 = port unreachable;
4 = fragmentation needed and DF set;
5 = source route failed.
content unused
  • Redirect Message
1
2
3
4
5
6
7
Type 5
Code
0 = Redirect datagrams for the Network.
1 = Redirect datagrams for the Host.
2 = Redirect datagrams for the Type of Service and Network.
3 = Redirect datagrams for the Type of Service and Host.
content Gateway Internet Address
  • Echo or Echo Reply Message
1
2
3
4
Type
8 for echo message;
0 for echo reply message.
The data received in the echo message must be returned in the echo reply message.

**DNS: **客户端使用DNS协议查询目标主机IP

1
2
cat /etc/resolv.conf	# dns server ip
host [cname] # loop up dns ip

上层协议通过封装使用下层协议服务

image-20241118142523676

通过分用向应用传递

以太网帧:
image-20241118142742378

MTU=1500

Type:

  • 0x800 : ip
  • 0x806 : arp
  • 0x835 : rarp

IP协议

无状态(UDP、HTTP)、无连接、不可靠的服务

image-20241118145250385


IP分片:数据报标识、标志和片偏移

  • 所有数据用于相同标识值
  • 保留位|DF(禁止分片)|MF(更多分片)
  • 实际偏移 off<<3,因此每个分片都是8的整数倍

何时分片:20 ipv4_header+1480 ipv4_dgrm


路由:

image-20241118150708068

1
2
3
4
route	# 查看路由表
route add
route del
echo 1>/proc/sys/net/ipv4/ip_forward # 转发功能

TCP协议

面向连接,可靠传输、基于字节流

可靠传输保证:

  • 应答机制:每个TCP报文段必须得到回答,seqno和ackno

  • 超时重传:定时重传未应答的报文段

  • 重组器:保证TCP报文段有序

UDP和IP则有上层协议处理数据确认和超时重传

image-20241118151924707

URG:紧急指针

PSH:立即从接收缓存区读数据

RST:复位报文,重连??会不会丢掉数据呢,我在cs144设置流erro

TCP选项

image-20241118152722957

  • 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
2
➜  ~ cat /proc/sys/net/ipv4/tcp_syn_retries
6

TCP状态转移

客户端:

  1. connect发送SYN,进入SYN_SENT
  2. 调用close或shutdown发送SYN。进入FIN_WAIT_1

孤儿连接:应用关闭并且处于主机FIN_WAIT_2状态

TIME_WAIT状态:等待2MSL(TCP最大生存时间)才能完全关闭

RFC 1122建议MSL=2min

  • 可靠终止TCP连接:确保收FIN、ACK,否则发送复位报文
  • 保证迟来的TCP被丢弃而不会进入下一个新的化身,因为端口无法被打开两次,这样保证了不会影响下一次连接

通过SO_REUSEADDR选项强制关闭

服务端:

  1. listen进入LISTEN状态
  2. 收入到SYN放入内核等待队列,同时发送SYN,ACK进入SYN_RCVD状态
  3. 收到ACK进入ESTABLISHED,双方能数据交互了
  4. 收到FIN进入CLOSE_WAIT,等待服务器应用关闭
  5. 发送FIN进入LAST_ACK
  6. 收到ACK关闭连接

image-20241118154145815

复位报文:

当请求连接端口处于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
2
3
4
➜  ~ cat /proc/sys/net/ipv4/tcp_retries1   
3
➜ ~ cat /proc/sys/net/ipv4/tcp_retries2
15

拥塞控制:控制SWND变量

image-20241118180915625

看到用了cubic算法

1
2
➜  ~ cat /proc/sys/net/ipv4/tcp_congestion_control
cubic

慢启动+拥塞避免:

CWND初始值为2~4个SMSS

CWND+=min(N,SMSS)N指此次确认包含的,之前未被确认的字节数

超过慢启动门限(ssthresh),线性增加

每个RTT时间重新计算

或每收到对新数据的确认报文段就更新:CWND+=SMSS*SMSS/CWND

倘若是传输超时,政策不变:

ssthresh=max(FlightSize/2, 2*SMSS)

CWMD<=SMSS

快速重传+快速恢复:

  1. 若接收3个重复确认报文:ssthresh=max(FlightSize/2, 2* SMSS), CWND=ssthresh+3*SMSS

  2. 每收到1个重复确认时,CWND=CWND+SMSS

  3. 收到新数据确认时,CWND=ssthresh

通信案例

HTTP代理服务器:

正向代理:

设置环境变量http_proxy,任务http请求都将由代理服务器代理

export http_proxy="host:port"

方向代理:

服务器转发请求到内部网络进行代理并返回

透明代理:

只能设置在网关上,数据必然经过网关

部署squid代理:

1
2
3
acl localnet src xxx/x
http_access allow localnet
sudo service squid3 restart

HTTP请求

1
2
3
4
GET http://www.baidu.com/index.html HTTP/1.0
User-Agent:Wget/1.12(linux-gnu)
Host:www.baidu.com
Connection:close

GET、HEAD、OPTIONS、TRACE、PUT和DELETE等方法时等幂的,POST多次发送则影响服务器资源

linux提供HEAD、GET、POST来快速测试Web服务器

HTTP应答

1
2
3
4
5
6
7
HTTP/1.0 200 OK
Server:BWS/1.0
Content-Length:8024 # 消息体非空必须指定
Content-Type:text/html;charset=gbk
SetCookie:BAIDUID=A5B6C72D68CF639CE8896FD79A03FBD8:FG=1;expires=Wed,04-
Jul-42 00:10:47 GMT;path=/;domain=.baidu.com
Via:1.0 localhost(squid/3.0 STABLE18)

image-20241118190324539

使用cookie保存状态,“BAIDUID”指定Cookie的名 字,“expires”指定Cookie的生存时间,“domain”和“path”指定该Cookie 生效的域名和路径

这里每行都要\r\n,空行只包含\r\n