2017.05.03 初稿,
回头继续补充
2017.05.21 修正MTU,MSS的描述
----------------------------
TCP 协议
TCP 报头总长度=固定部分长度 + 可选部分长度,其中固定部分的长度为 5x4=20 Byte,可选长度若不满足 4 字节对齐则补零。
各个字段解释如下:
源端口: 16 bit,取值范围 0~65535
目标端口:16 bit,取值范围 0~65535
注:0-1023 为系统端口或特权端口(仅管理员可用)
客户端程序随机使用的端口 ,其范围的定义:
/proc/sys/net/ipv4/ip_local_port_range
---------------------------------------
序号:32bit,表示本报文段所发送数据的第一个字节的编号。在TCP连接
中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从 0 开始
确认序号:32bit,表示接收方期望收到发送方下一个报文段的第一个字节数据
的编号
------------------------------------------------------------------------------------
数据偏移:4bit,也成为 TCP Head Length( TCP 头长度 ),以 4 Byte 为单位计,若 TCP 头无选项字段,则其值为 5,即 TCP 头长 20 Byte
保留:6bit
FLAG:6bit
--URG 表示报文段是否包含紧急数据,置位时需配合后面的 紧急指针 字段使用
--ACK 表示前面的 确认序号 字段是否有效,连接建立后,ACK必须为1
--PSH 置位表示要求上层应用程序立即从 TCP 缓冲区中读走数据,清零表示数据暂存在 TCP 缓冲区中
--RST 一种场景是在客户端请求的端口在服务器端没有开启时,服务器端回复的报文中置位RST
--SYN 同步标志,只有 TCP 三次握手的前两次该标志位置位
--FIN 置位表示本端数据发送完毕
窗口:16bit,表示现在允许对方一次发送的数据量,单位是字节
----------------------------------------------------------------
校验和:整个 TCP 段(头 + 数据)的校验和
紧急指针:标记紧急数据在数据字段中的位置,是一个偏移量,和序号字段 配合使用
----> 此处本来有个eNSP模拟器上的抓包,但是貌似不能上传非图片格式的文件
TCP 三次握手
三次握手的时候,TCP 层还没有承载上层数据
TCP 四次挥手
TCP 有限状态机和状态迁移
------> 重点补充,包括建链和拆链
TCP 超时重传
TCP 模块为每个报文段都维护一个重传定时器,该 定时器在 TCP 报文段第一次被发送时启动。若该定时器溢出(即未及时收到确认),TCP 模块将重传 TCP 报文段并重置定时器 。至于下次重传的超时时间如何选择,以及最多执行多少次 重传,就是TCP的重传策略。
/proc/sys/net/ipv4/tcp_retries1 <--- 指定在底层IP接管之前 TCP最少执行的重传次数,默认值是3
/proc/sys/net/ipv4/tcp_retries2 <--- 指定连接放弃前TCP最 多可以执行的重传次数,默认值是15
需要明确与前者的区别
TCP 拥塞控制
RFC 5681 详细介绍了拥塞 控制的四个部分:
慢启动(slow start)
拥塞避免(congestion avoidance)
快速重传(fast retransmit)
快速恢复(fast recovery)
/proc/sys/net/ipv4/tcp_congestion_control <--- 当前使用的拥塞控制算法
1.主机用自己的掩码和目的IP相与,然后对比是否自己和对方同属一个网络号。
2.一般来讲HOST上一个端口(如:80)只属于一个进程,但HOST上有2块网卡,获得2个IP,能否有两个进程分别侦听2个80端口?可以,把IP和端口绑定起来,我们称之为socket。
========================================================
UDP 协议
========================================================
ARP 协议
ARP
ip nei
arp -n
RARP
反向ARP
========================================================
IP 协议
IP 报头总长度=固定部分长度 + 可选部分长度,其中固定部分的长度为 5x4=20 Byte,可选长度若不满足 4 字节对齐则补零。
固定部分各个字段解释如下:
IP协议版本:4bit,这里只讨论 IPv4
IP首部长度:4bit,最大值为15,单位为 4 Byte,所以 IP 头部最长为15*4=60 Byte
区分服务:8bit,只有在使用区分服务
(DiffServ)时,这个字段才生效
IP包总长度:16bit,单位为 Byte,总长度必须不超过最大传送单元 MTU
------------------------------------------------
标识:16bit,IP包编号,配合FLAG和片偏移使用,在同一个包的若干分片中,该值是相同的
FLAG:3bit,| reserved | MF | DF | MF(More Fragment),置位表示后面还有分片 DF(Don't Fragment),置位表示不分片
片偏移:13bit,单位为 8 Byte,可以理解为分片的编号,接收端靠这个编号组装获得完整的 IP 包
------------------------------------------------
TTL:8bit,每过一跳路由器其值减一,减到 0 则丢弃,一次防环
cat /proc/sys/net/ipv4/ip_default_ttl //查询默认 TTL(一般 windows 为 128,Linux 为 64)
echo 55 > /proc/sys/net/ipv4/ip_default_t 修改默认 TTL
上层协议:8bit,ICMP=1 IGMP=2 TCP=6 UDP=17
IP首部校验和:16bit,只是首部校验和
------------------------------------------------
源IP地址:32bit,
目的IP地址:32bit,
------------------------------------------------
MTU(Maximum Transmit Unit)
数据链路层一次传输其上层(此处讨论 IP 层) 数据的最大长度,对于常见的以太网接口其默认 MTU 值为 1500 Byte,即如果 IP 层的包大于 1500 Byte 的话就需要IP层自己分片然后传给二层,各分片在 IP 层的
标示 字段的数值是相同的。
MSS(Maximum Segment Size)
TCP 层除去 TCP 头后允许传输的最大数据(即 payload),单位是 Byte,如果二层 MTU 为1500,且 TCP 层与 IP 层无选项字段,则 MSS=1500-20-20=1460 Byte 如果 TCP 上层应用有大于 1460 Byte 的数据需要传输,则可能会在 TCP 层分段。若数据过大且未分段,则会留给IP层分片,分片中的payload不大于1500-20=1480 Byte。
何时确定分段:在 TCP 三次握手中 MSS 信息会添加在选项字段中发送给对方(MSS 选项只和 SYN 一起出现两次),通知对方自己期待对方发送多大的段,该值不是协商的(这点与窗口大小协商不一样 ),各自用各自的。
引申:该选项字段分为
| kind | len | MSS |,分别为1Byte,1Byte,2Byte,kind 表示是什么选项,取值为 2 表示是 MSS 选项,len 表示选项信息的长度,MSS 的值代表的就是期待对方分段的值。当 TCP 层分段分的够小的时候,IP 层就不用分片了。
========================================================
Ethernet II 协议
通常所说的帧结构都不算前导字符,所以帧结构中 payload 之外的数据有 6+6+2+4=18 byte
10Mbps以太网时代,以太网帧最小长度为 64 Byte,保证了 CSMA/CD 中最极端的碰撞都能够被检测到,所以 Data 部分的数据最小应该为
46,不足的话需要补 0
我们直观感觉是 Data 值越大传输效率越高,而 Data 超过 1500 Byte 时影响了帧速率(每秒传送的帧数量),所以说
1500 在当时是一个折中的结果,是最优值(还有人说是这是当时的人一拍脑袋定下的,等有时间再找资料看看其中的数学原理)。
========================================================
DHCP 协议
========================================================
DNS 协议
-------必背-------
1000 0000 = 128
1100 0000 = 192
1110 0000 = 224
1111 0000 = 240
1111 1000 = 248
1111 1100 = 252
1111 1110 = 254
1111 1111 = 255
-------------------
回看:
分片在哪一层?段又是怎么分的?MSS 该怎么理解?MSS如何与窗口大小配合使用?