1.数据链路层协议很多:以太网协议、PPP协议、SLIP协议、令牌环网协议、FDDI光纤网协议
以太网帧结构 :协议要求data部分长度最少为46字节
-----------------------------------------------------------------------------------------
|MACdesAddr(6B)|MACsrcAddr(6B)|protocal(2B)| data | crc
-----------------------------------------------------------------------------------------
2.数据链路层的环回接口
传送给环回接口的IP数据不能在任何网络上出现。127.0.0.1和自身地址的IP包、广播和多播IP包都会在数据链路层中被送至环回接口,投递到输入队列
3.数据链路层的MTU:最大传输单元。以太网1500字节;802.3网络1492字节。大于MTU的网络层数据进入数据链路层之后会被分片。路径MTU:取决于数据通过的网络的最小MTU
4.网络层(IP层):不可靠-丢弃发生错误的IP包,然后发送一个ICMP消息报给源端。
5.IP数据包:(大端模式)
------------------------------------------------------------------
|ver(4b)|headlen(4b)|TOS(4b)|packetlen(16b) |
| flag(16b) | flag(3b) | segmentoffset(13b) |
| TTL(8b)| protocal(8b) | headchecksum(16b) |
| srcIPAddress(32b) |
| desIPAddress(32b) |
| options(?) |
| data |
------------------------------------------------------------------
TOS服务类型:已经很少使用,最多同时置其中1位。4为分别代表:最小延时、最大吞吐量、最高可靠性、最小费用
TTL网络生存时间:最多经过的网络跳数。
6.主机和路由器的IP路由选择:如果目的主机或目的网络在自己的路由表中存在对应的下一条路由,则将该IP包转发给下一跳路由,否则将其转发给默认路由器。
7.子网寻址:B类地址类型为: 16b网络号+xb子网号+16-xb主机号。子网络号=IP地址&子网掩码再掉高16b去掉低16-xb
8.ARP地址解析协议:在局域网中发现IP地址对应的MAC地址,并提高IP地址<->MAC地址的高速缓存
工作过程:为找到IP地址对应的MAC地址,主机广播携带该IP地址的ARP包,收到该ARP包的所有主机判断该IP是否为自身IP,如果是返回携带自身MAC地址的ARP响应,否则静默;
收到该ARP包的所有路由器判断该IP地址在自己的高速缓存中是否存在下一条网络路由,如果有,返回自己的MAC地址,否则静默。
9.icmp报文的作用:有icmp报文的类型决定
10.UDP数据报格式:(8Bytes)
------------------------------------
| srcport(16b) | desport(16b) |
|packetlen(16b) | checksum(16b) |
| data |
------------------------------------
11. 广播:广播对象为局域网中的所以主机,不能经过路由器。
组播:将数据发送到internet中的一个主机组,可以经过路由器
广播时的MAC地址: FF:FF:FF:FF:FF:FF
广播时的IP地址:netid1:netid2.255.255 指向B类网络的广播或指向所以子网的广播
netid1:128.1.2.15 指向B类子网的广播 (掩码255.255.255.240)
255.255.255.255 在本子网内广播
多播时的MAC地址: 01:00:00:00:00:00
多播IP地址:D类IP地址用于多播 1110+多播组ID(28b) (224.0.0.0-239.255.255.255)
多播将多播组地址的低23位映射到以太网MAC地址实现多播组地址到以太网地址的转换。由于还剩5位没有映射,所以这种映射是不唯一的,因此需要其他协议实现额外的数据过滤。
IGMP组管理协议用于支持主机和路由器进行多播
12.tcp缓存中的流是没有边界的,接收方并不知道每次接收多少个数据。
一个IP地址和一个端口被称为插口
13.tcp包结构
---------------------------------------------------------------------------------------------------
| srcport(16b) | desport(16b) |
| serial NO.(32b) |
| ACK serial NO.(32b) |
| headlen(4b)|saved(6b)|URG|ACK|PSH|RST|SYN|FIN| window(16) |
| packgechecksum(16b) | URGpointer(16) |
| data |
----------------------------------------------------------------------------------------------------
序号用以标识tcp发送端发送的字节流;ACK为1时,应答序号有效,通知发送方该序号前面的字节流都已经收到,延迟确认算法下,不一定每接收一个tcp包都会有应答。这样可以节省流量。(应答序号=某个序号+1)
URG:紧急指针标记,当为1时,URGpointer有效
ACK:确认序号有效
PSH:发送方要求接收方将接收到的本帧数据以及缓存中的数据全部提交给接收进程,不要因等待额外的数据而在缓存中滞留。
RST:重建连接
SYN:同步标志用以发起一个连接
FIN:结束标志用以终止本端的发送。(半关闭)
window:该端的接收缓存大小,随着tcp将数据提交给应用层,缓存容量会变大。window可以用以进行流量控制。
MSS和MTU的区别:MTU指某个网络允许的最大传输单元,是一个固定值。MSS是IP包该端允许接收的最大分片长度,为了避免分片,可以使用MTU发现算法为MSS赋值。可以使用MSS进行流量控制。
MSS选项是TCP包头中的选项,只能出现在tcp连接的三次握手中。MSS通常为MSS=MTU-IP头-TCP头
14.tcp连接的建立与终止
连接过程要完成的工作:窗口的交换(每个tcp包都会携带window大小),MSS的通知。
连接建立的超时:发送端发送SYN信号后接收端无应答,将出现连接超时。这是发送端会重传同步信号。
TCP的半关闭:TCP允许连接的一端在结束发送后还能接收来自另一端数据的能力。发送FIN的一方将结束自己的发送,而另一方将结束接收。接收到FIN的一方可以认为另一方的数据已经发送完成,FIN相当于一个文件结束符。
TIME_WAIT状态:(2MSL等待状态,MSL是网卡内的一个参数)MSL是TCP发送方认为在该时间之内发送的TCP包还在网络的,超过这个时间认为包已经不在网络中(要么被丢弃要么被接收)。所以在发送一个数据后的2MSL时间内没有收到应答,就可以认为数据已经被丢弃了。MSL的取值从30s-120s,不同的版本实现不同
TIME_WAIT状态是tcp连接被关闭后,该插口处于等待被释放的状态,等待时间为2MSL。(防止旧的以该插口为目的地址的数据进入新的以该插口为连接的新连接)在2MSL等待状态期间,任何迟到的报文将被丢弃。
只有主动关闭连接的一方(发送FIN的一方)才会进入2MSL等待状态,被动关闭连接的一方不会进入2MSL等待状态.
复位报文段:RST报文段的作用有以下几种:
a.连接不存在的服务器端口(未被服务器打开),则收到RST连接复位报文段。
b.用以异常终止一个连接。有2个优点:发送方丢弃任何发送缓存数据立即发送RST报文段;接收方无须应答,立即关闭连接
c.向不存在的连接发送数据,将收到RST复位报文段。(半打开:连接的一方已经失去连接而另一方并不知道)
15.TCP对交互数据和成块数据的处理算法是不同的。
16.TCP的交互数据流
延迟确认算法:对某一个数据的确认,将在200ms内等待是否有数据需要捎带给等待应答的对方。
Nagle算法:要求发送方发送一个报文段后,必须收到了ACK应答才能发送下一个报文段。优势是:可以在这段时间内收集应用层数据到发送缓存,打包发送,减少网络中包的数量,提供网络性能。
Nagle算法常常受到延迟确认算法的影响而使得发送数据的速度很慢,产生发送时延。
插口API用户可以使用TCP_NODELAY选项来关闭Nagle算法。
17.TCP的成块数据流
滑动窗口协议:收发数据的双方通过窗口大小来告知对方自己当前剩余的缓存大小,不接收比自己缓存大的数据包,当window=0时,表示不能再接收数据,过一段时间,如果window变化,将会再发送一个额外的ACK数据包,通知对方自己的window大小。
慢启动:慢启动实现了一个拥塞窗口congestion window(cwnd)参数:表示没有收到ACK应答前最多能发送的报文段个数。当tcp连接刚建立好时,cwnd被初始化为1,每收到一个ACK,cwnd就加1.慢启动属于发送方流量控制,滑动窗口协议属于接收方流量控制。
18.TCP的4大定时器
每个连接都有4个独立的定时器。
a.超时重传定时器:限定用于等待对方发送ACK的时间。
b.坚持定时器:当接收方window关闭时(=0),发送方的坚持定时器开始启动,限定查询接收方window打开的时间。(避免接收方window打开的应答丢失,而使连接进入死锁)
c.保活定时器:限定检测一个空闲连接的另一端何时崩溃或重启的时间。主要用于服务器端。
d.2MSL等待定时器:限定一个连接处于TIME_WAIT状态的时间。
本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1699238,如需转载请自行联系原作者