第一章 一系列的介绍
第二章 互联网
对于五层网络模型来说每一层的功能如下
- 接收上一层的数据,添加头部或者尾部进行封装,将数据转发到下一层。
- 接收下一层的数据,去掉头部或者尾部进行解封,将数据转发到上一层。
链路层
链路层
传输的数据单元叫帧
。链路层和物理层关系密切,对于不同的物理介质支持有不同的链路层协议。以太网(Ethernet)
是链路层协议族。可以清晰的描述链路层的功能。如下
- 前导序列和帧开始标志由网卡剥离出来。
以太网给每个主机引入
MAC地址`。MAC地址理论上48个比特,前24个由IEEE给网卡厂家,后24网卡厂家自己确定。帧长度/帧类型
怎么区分呢? 以太网规定帧报文数据最大1500字节也称MTU, 并且还规定帧类型最小值为1536。当这个字段小于1500则表示为帧长度,当这个字段大于等于1536表示帧类型。帧检验序列
根据上面一些信息生成的循环冗余值(CRC32)。防止帧半路损坏或者丢了
网络层
IP包总长
需要注意就是这个字段。从上图可以知道0-159共160bit,也就是20个字节。IP包总长占16bit。也就是最大65535。所以数据部分最大为65535 - 20 = 65515。ARP协议
网络层向某个IP地址发送数据包时候,通过ARP协议IP地址到MAC地址查询表查询。如果没有对应的MAC地址。则向链路层网络所有可达知己发送ARP报文得到MAC地址。子网
是IP地址与子网掩码按位与运算结果相同的一群主机,每一个主机都有一个路由表如下。目标子网
是目标IP地址所在子网。网关
是指当前子网通过链路层发送数据的下一台主机。如果网关
为空则表示为直达路由可达的。
分片
上面我们得知链路层帧的MTU=1500字节,而IP数据包长度最大65535。那么从IP层到数据链路层,肯定是不能直接发送这么大的帧的。所以采用了分片。当收集齐所有的分片数据后,才能将数据包传输给上层。
传输层
UDP
报头8字节结构如下
TCP
TCP首部如下
三次握手
这玩意在网络游戏实战那本书已经说了一遍了。但是还是再搞一遍吧。这玩意真的很重要。
- 首先主机A发送连接请求,设置Seq=1000。
SYN什么意思?
标识主机A给主机B说我将要给你发送Seq+1为起始位置的数据流,然后设置主机A的状态SND_UNA=1000(上面有介绍,表示Seq=1000这个报文没有被确认
)。 - 主机B收到了SYN标志位的数据,设置RCV_NEXT=1001(
表示希望主机A下次发送的序号为1001
),然后发送SYN-ACK报文。 - 然后主机A接收到了SYN-ACK报文。知道了主机B希望他下一次发送的报文序号为1001,所以发送Seq=1001和ACK=3001报文。
数据传输
TCP传输有以下几种控制
流量控制
TCP报头有个字段叫接收窗口。下面这个图多看几遍就懂了。
首先
主机B回应A的SYN-ACK时,告诉主机A我可以接收300字节的数据。所以主机A最多给B发送3次100字节的数据(分别为Seq=1001,1101,1201
这三个报文段)然后就不发了。
然后
主机B在接收到Seq=1001报文然后确认给主机A说我还能接收200字节的数据。但是主机A自己知道后面还有200字节的数据还没到,所以还是没发东西。
最后
主机B确认了序号seq = 1101的数据报时,接收200字节已经处理掉了50字节,给主机A说我还能接收150字节的东西。然后主机A知道路上还有个Seq=1201报文还在发送中,所以只发送了50字节。
延迟等待
主机收到TCP报文不立马确认,而是等待500ms或者收到下一个报文。有效的减少了一半的ACK。拥塞控制
MSS(最大分段大小) = 1500 - IP头20字节 - TCP头20字节。
首先先设置MSS初始值(一半 为2倍),然后收到一个ACK,MSS加1。一旦数据包丢失MSS直接减少一半。Nagle算法
在网络实战那本书Socket有设置这个的参数。主要就是发一个TCP报文。最少就是40个头部字节。如果发送数据很小,而且很密集。头部字节占用的带宽会超级大。所以就会等收集足够多的报文后一起发送。四次挥手
在网络实战那本书已经说过了,这里粗略讲一下,A是关闭发起者发送FIN,然后进入TIME_WAIT_1阶段,B接收到了FIN将会回应一下A。A收到ACK进入TIME_WAIT_2阶段。等到B没有要发的数据了,他也会向A发送FIN,然后进入LAST_ACK。主机A收到B的FIN后进入TIME_WAIT(一般为4分钟,用于处理主机B重发)阶段,向B发送确认,然后B收到ACK直接关闭。