嵌入式课堂笔记10
一、网络基础
- 为什么要进行网络通讯?
(1) 进程间通讯专注于同一台计算机内部的数据传输需求
(2) 网络通讯则旨在实现不同计算设备之间的信息交互 - 实现网络通讯所需的支撑包括:
(1) 通讯设备
- PC自带的网卡接口
- 常用的路由设备包括路由器及各类交换机
- 主要依靠光纤连接线、电缆以及基站天线提供物理连接
(2) 通讯协议(明确的数据发送内容与方式)
现代操作系统的默认配置已经内置了完整的protocol体系
值得注意的是Linux系统尤其擅长处理复杂的networking任务
而硬件级开发则必须重新构建一套完整的networking架构
(3) 简单 networking只需掌握基本的调用方法并能够进行简单的调试操作

协议栈设计为什么要采用分层架构?

物理层:通信介质的信号被转换为二进制0101的数字信号。
数据链路层:局域网之间的计算机通信依赖于以太网帧中的MAC地址。
网络层面:IP地址与路由信息共同作用实现全球访问。
传输层面:TCP/UDP协议采用可靠传输机制但传输速度较慢;而UDP协议不具备可靠性但传输速度较快;此外,在传输过程中需要使用端口号以区分不同应用程序的需求。
会话层次:会话层负责管理发送的数据。
表示层次:表示层次负责文件格式的统一。
应用层次:应用程序进行功能操作
协议栈实现数据的压缩加密和解压解密


③IP地址
(1)ip地址:实际上是32位二进制数(01100100.00000100.00000101.00000110)100.4.5.6
(2)公网ip(广域网通信):a类 1.0.0.1~126.255.255.254
b类 128.0.0.1~191.255.255.254
c类 192.0.0.1~223.255.255.254
d类 224.0.0.1—239.255.255.254组播,VRRP协议,keepalive高可用
e类 240.0.0.1—255.255.255.254 科研
(3)私网ip(局域网通信):A 10.0.0.0~10.255.255.255
B 172.16.0.0~172.31.255.255
C 192.168.0.0~192.168.255.255
(4)如何解决IP地址荒?
1)ipv4升级到ipv6
2)网络地址转换NAT(Network Address Translation):将内网ip转为公网ip
(5)子网掩码的作用
1)决定一个网段的大小(可用ip的数量)
2)同一个网段的ip地址,才能直接相互通信,不同网段的ip地址,需要路由器才能相互通信!
(6)DNS协议:域名解析
把域名解析成ip地址
(7)ARP协议
把ip地址解析成mac地址(物理地址,全球唯一)(局域网通信必须通过MAC地址)
④TCP协议:传输控制协议
(1)特点:面向连接、可靠的字节流传输
(2)TCP的报文段格式
1)端口号
端口号的作用:确定和机器上哪个应用程序通信
端口号的取值范围

2)序列号seq(随机生成)
3)TCP标识位
SYN:建立链接
ACK:回应标识
FIN: 断开链接
PSH: 数据包
URG: 紧急指针
RST : 重置(重传)
4)滑动窗口机制
5)检验方式
奇偶校验Parity Check
bcc异或校验法(block check character)
crc循环冗余校验(Cyclic Redundancy Check)
md5校验和数字签名
海明码校验
6)数据大小
a.局域网的链路层传输数据的最大长度是1518bit,包括帧的头尾部长度18bit(头14+尾4),IP头部长度为20bit,TCP头尾部长度为20bit,UDP头尾部长度为8bit
b.TCP在局域网中传输数据的最长长度=1518-18-20-20 = 1460bit
c.广域网传输不限定大小,因为超过限定大小,会进行拆包发送
(3)如何连接?
1)建立连接:三次握手
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手
2)断开连接:四次挥手
A.客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
B.服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
C.客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
D.服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
E.客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
F.服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
3)为什么是三次握手和四次挥手?
网络通信是全双工的
4)dos、ddos攻击
(4)如何保证可靠有序的传输?
1)三次握手建立连接
2)应答机制,也就是将数据发送给对方后,对方必须应答是否发送成功
3)使用“滑动窗口”机制,根据网络的好坏,控制发送的分组数据的大小
⑤udp协议:用户数据报协议
(1)无连接不可靠传输
(2)UPD的报文格式

局域网中采用UDP协议传输数据时

二、网络编程
1、TCP服务器实现过程
创建套接字:socket函数
给套接字绑定ip地址和端口号:bind函数
出现无法绑定?解决办法:setsockopt函数
将套接字文件描述符,从主动变为被动文件描述符(做监听准备):listen函数
被动监听客户的连接并响应:accept函数
服务器调用read(recv)和write(send),收发数据,实现与客户的通信
调用close或者shutdown关闭TCP的连接
2、TCP客户端的实现过程
用socket创建套接字文件,指定使用TCP协议
调用connect主动向服务器发起三次握手,进行连接
调用read(recv)和write(send)收发数据
调用close或者shutdown关闭连接
server.c



client.c



