linux网络编程系列-TCP/IP模型

### OSI:open system interconnection ###

开放系统互联网模型是由ISO国际标准化组织定义的网络分层模型,共七层

1. 物理层:物理定义了所有电子及物理设备的规范,数据传输单位为比特(b),本层定义规范有EIA/TIA RS-232、RJ-45等,实际是由设备如网卡等
2. 数据链路层:对物理层收到的比特流进行数据成帧。提供可靠的数据传输服务,实现无差错数据传输。本层数据单位为帧(frame)。本层规范SDLC、PPP、STP等,使用设备如switch交换机等
3. 网络层:将各个子网之间的数据进行路由选择,分组与重组。本层数据传输单位为数据包(packet)。属于本层的规范有IP、IPX、IGMP等。使用设备如路由器
4. 传输层:提供可靠的数据传输服务,检测路由器丢弃的包,然后产生一个重传请求,能够将乱序收到的数据包重新排序
5. 会话层:管理主机之间会话过程,包括会话建立、终止和会话过程中的管理,传输单位(SPDU)
6. 表示层:对网络传输的数据进行变换,使得多个主机之间传送的信息能够互相理解,包括数据的压缩、加密、格式转换等,传输单位(PPDU)
7. 应用层:应用层与应用程序界面沟通,以达至展示给用户的目的,在此常见的协议有:HTTP、HTTPS、FTP、SSH、POP等,传输单位(APDU)

### TCP/IP四层模型 ###

1. 链路层:类似OSI中物理层和数据链路层的集合,主要规范:ARP、RARP
2. 网络层:类似OSI中网络层,主要规范:IP、ICMP、IGMP
3. 传输层:类似OSI中传输层,主要规范:TCP、UDP
4. 应用层:类似OSI中会话层、表示层和应用层的集合,主要协议例如:ftp、telet、qq等


#### 端口 ####

1. 众所周知端口(Well Known Ports):从0到1023,这些端口由IANA分配和控制,通常这些端口明确表明了某种服务,例如:21端口为ftp服务
2. 注册端口:从1024到49151,这些端口不受IANA控制,但有IANA登记并提供使用情况清单,许多服务绑定于这些端口,这些端口同样用于许多其他的目的,例如:1433 Microsoft SQL服务端口
3. 动态或私有端口:49152到65535,IANA不管这些端口,实际上,机器通常从1024起分配动态端口,但也有例外,SUN的RPC端口从32768开始

#### 协议说明、封装、分用 ####

MTU:以太网最大数据传输单元
ICMP:传递差错信息、时间、网络信息等控制数据
ARP:地址解析协议,映射IP地址到MAC地址
RARP:地址解析协议,映射MAC地址到IP地址
封装: 应用层->链路层 (IP地址转换为MAC地址)
分用: 链路层->应用层 (MAC地址转换为IP地址)

#### 主机A ping 主机B 数据在网络中的传输说明 ####

1. 应用程序判断ping的是主机名还是IP地址,如果是主机名会调用gethostbyname()解析主机B,将主机名转换成一个32位的IP地址,这个过程叫做DNS域名解析
2. ping程序向目标IP地址发送一个ICMP的ECHO包
3. 将目标主机的IP地址转换为48位硬件地址,在局域网内发送ARP请求广播,查找主机B的硬件地址
4. 主机B的ARP协议层接收到主机A的ARP请求后,将本机的硬件地址填充到应答包,发送ARP应答到主机A
5. 发送ICMP数据包到主机B
6. 主机B接收到主机A的ICMP包,发送响应包
7. 主机A接收到主机B的ICMP响应包

### IP数据报格式 ###

1. 版本:IPv4字段值为4,IPv6字段值为6
2. 首部长度:以32位的字为单位,该字段长度为4位,最大值为15,所以首部长度最大为60个字节
3. 总长度:该字段长度为16位,以字节为单位,该字段长度包含IP的头部和数据部分,IP数据报最大可达65535个字节
4. 标识:16位标识,用来标识一个IP包,每发送一个此值会加1
5. TTL(TIme To Live):表示数据报最多可经过的路由器的数量,每经过一个路由器,TTL值减1,减为0时丢弃,并发送ICMP报文给源主机,TTL可以避免数据报在路由器之间不断循环
6. 协议类型:表示IP层上承载的是哪个高级协议,协议栈知道交给哪个层的协议处理,1 ICMP 2 IGMP 6 TCP 17 UDP
7. 网际校验和:接收方接收到发送方的数据后按照校验算法对数据进行校验,检验数据在传输过程中是否发生错误

### TCP报文格式 ###

1. 源端口号与目的端口号:源端口号和目的端口号,加上IP首部的源IP地址和目的IP地址唯一确定一个TCP连接
2. 序号:序号表示在这个报文段中的第一个数据字节序号
3. 确认号:仅当ACK标志为1时有效,确认号表示期望收到的下一个字节的序号
4. 头部长度:4位 ,TCP头部最多60个字节
5. 保留位:6位,必须为0
6. 6个标志位:URG-紧急指针有效、ACK-确认序号有效、SYN-发送连接的同步序号、FIN-表示要终止一个连接、RST-连接重置、PSH-接收方将这个报文交给应用层
7. 窗口大小:通过窗口大小来达到流量控制
8. 校验和:对TCP头与数据进行校验

### TCP连接建立三次握手 ###

TCP A 发送SYN a->TCP B //A请求建立连接
TCP B 发送SYN b ACK a+1 ->TCP A //确认收到请求,并请求A回复
TCP A 发送ACK b+1 ->TCP B  //对B的请求进行回复

### TCP连接终止的四次握手 ###

TCP A 发送FIN x ACK y->TCP B //A请求终止连接
TCP B 发送ACK x+1 ->TCP A //B收到终止请求并回复给A
TCP B 发送FIN y ACK x+1->TCP A  //B根据A的终止请求也请求终止连接
TCP A 发送ACK y+1->TCP B //A收到终止请求并回复给B

### 滑动窗口协议(流量控制) ###

1. 通告接收窗口:预防应用程序发送的数据超过对方的缓冲区,接收方使用的流量控制
2. 拥塞窗口(cwnd):预防应用程序发送的数据超过网络所能承受的能力,发送方使用的流量控制
3. 发送窗口取两者较小值
4. 慢启动阈值(ssthresh:slow start threshold)
5. 慢启动阶段:cwnd从1开始按指数增长直到ssthresh
6. 拥塞避免阶段:cwnd按线性增长,直到拥塞,将cwnd=1,ssthresh减半

原文地址:https://www.cnblogs.com/Tabb/p/9267000.html