嵌入式课堂笔记10

一、网络基础
1、为什么需要网络通信?
①进程间通信解决的是本机内通信
②网络通信解决的是任意不同机器通信
2、实现网络通信需要哪些支持?
①通信设备
网卡:PC机自带
路由器,交换机
光纤、电缆、基站
②通信协议(发什么数据,怎么发数据,发完数据后做什么)
操作系统自带协议栈;(Linux的特点:丰富的网络协议)(使用通信协议)
裸机开发需要独立的协议栈
③简单网络通信只需要学会使用系统API(学会调试)
3、tcp/ip协议栈
①什么是通信协议?作用?
双方在做通信之前约定好的动作和传输数据的格式,使多台机器能够
相互通信
②OSI七层网络模型、Linux四层网络模型
嵌入式课堂笔记10_第1张图片
(1)协议栈为什么要分层?
分层的好处:各层之间是独立的,灵活性好,并且在结构上是可分割开的,易于实现和维护,能够促进标准化工作。
嵌入式课堂笔记10_第2张图片
物理层 :通信介质的信号到数字信号(二进制0101)转换
数据链接层 :局域网之间计算机通信 通过mac地址(物理网卡)通信
网络层:IP地址,路由(通过公网ip来访问全世界)
传输层 :tcp/udp tcp(可靠,速度慢) udp(不可靠,速度快) 端口(让不同的应用程序,同时使用网络)
会话层 : 控制发包的数据
表示层 : 文件格式
应用层 : 应用程序使用

协议栈实现数据的压缩加密和解压解密
嵌入式课堂笔记10_第3张图片
嵌入式课堂笔记10_第4张图片
③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)端口号
端口号的作用:确定和机器上哪个应用程序通信
端口号的取值范围
嵌入式课堂笔记10_第5张图片
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的报文格式
嵌入式课堂笔记10_第6张图片
1)局域网:UDP传输数据的最长长度 = 1518 - 18 -20 - 8 =1472bit
2)广域网:用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535- IP头(20) - UDP头(8)=65507字节。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误
(3)协议特点
1)无连接的:发送数据之前不需要建立连接,减少了开销和发送数据之前的延时。
2)尽最大努力交付:不保证可靠的交付,主机不需要维持复杂的链接状态表。
3)面向报文的:发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
4)没有拥堵控制
5)支持一对一、多对一和多对多的交互通信
4、TCP VS UDP
嵌入式课堂笔记10_第7张图片
二、网络编程
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
嵌入式课堂笔记10_第8张图片
嵌入式课堂笔记10_第9张图片
嵌入式课堂笔记10_第10张图片
client.c
嵌入式课堂笔记10_第11张图片
嵌入式课堂笔记10_第12张图片
嵌入式课堂笔记10_第13张图片

你可能感兴趣的:(嵌入式课堂笔记10)