目录
一. 实现网络通信需要哪些支持
1.通信设备
- 网卡:PC机自带
- 路由器,交换机
- 光纤、电缆、基站
2.通信协议
- 操作系统自带协议栈;(Linux的特点:丰富的网络协议)
- 裸机开发需要独立的协议栈
二. 协议栈
物理层是第一层。在上面的是上面一层,在下面的是下面一层。
哪个协议在哪一层:FTP,NFS / SMTP(邮件协议),DNS / TCP,UDP / IP,ARP,RARP / IEEE(以太网协议)
1.分层的好处/为什么要分层?
- 各层之间是独立的
- 灵活性好
- 结构上可分隔开
- 易于实现和维护
- 能促进标准化工作
使每一层协议能复用,并得到更好的维护
2.分层的作用
协议栈实现数据的压缩加密和解压解密
没一层都会加相应的数据,到最后加完了一起发给别人,别人再一层层消减数据。
3.各层作用
(1)物理层
传输比特流,将比特流(强弱电流)和数字信号(二进制0101)相互转化
(2)数据链路层
负责在两个相邻的节点之间准确的传输数据,实现局域网通信。局域网是通过mac地址(物理网卡)通信的(192.168.1.177是局域网IP)
(3)网路层
生成IP地址,选择合适的路由,正确的找到目的站(通过公网IP访问全世界,公网IP每天看不一样的)
(4)传输层
负责两个主机之间的端对端的数据连接&传输,定义了一些传输数据的协议和端口号。TCP(可靠,速度慢),UDP(不可靠,速度快),端口(让不同的应用程序同时使用网络)
(5)会话层
负责在不同的PC的不同进程之间建立或者拆除连接
(6)表示层
发送数据的格式,不同的pc机拥有不同的编码方式,需要在这里进行转换,转换成网络通信中采用的标准表现形式
(7)应用层
为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
三. IP地址
1.IP地址
可以通过IP地址找到一台机器,端口号找到这台机器上与之通信的软件
实际上是32位二进制数 (01100100.00000100.00000101.00000110)100.4.5.6
0.0.0.0 - 255.255.255.255
2.公网IP(广域网通信)
用来做世界任意两台电脑之间的通信
- a类 1.0.0.1 —126.255.255.254
- 127.x.x.x都是环回地址,比如127.0.0.1不属于任何一个有类别地址类,它代表设备的本地虚拟接口,你可以ping 127.0.0.1来测试网卡是否是好的
- 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地址慌?
- ipv4升级到ipv6(32位升级到128位)(但成本太高,全世界都要换硬件等)
- 网络地址转换NAT(Network Address Translation):将内网ip转为公网ip(根据内网看哪个公网可以用,让公网给你分配个可以用的)
5.子网掩码的作用
- 决定一个网段的大小(可用ip的数量)(子网掩码位数不一定要是8的倍数)
- 192.168.11.0/24 ===》 192.168.11.0 netmask 255.255.255.0
192.168.11.0 网络号
192.168.11.1 起始地址
192.168.11.254 结束地址
192.168.11.255 广播地址 - 相当于256 - 2 = 254个可用IP
- 192.168.11.0/24 ===》 192.168.11.0 netmask 255.255.255.0
- 同一个网段的ip地址,才能直接相互通信,不同网段的ip地址,需要路由器才能相互通信!
6.DNS协议:域名解析
把域名解析成ip地址(www.baidu.com就是域名)
公网IP一直在变,让域名和动态IP改变,这样IP一变,域名就会重新绑定,通过一直不变的域名可以访问你想要访问的地方。
7.ARP协议
把ip地址解析成mac地址(物理地址,全球唯一)(局域网通信必须通过MAC地址)
四. TCP协议:传输控制协议
1.特点
面向连接、可靠的字节流传输
2.TCP的报文段格式
(1)端口号
- 端口号的作用:确定和机器上哪个应用程序通信(指定80端口号,即用HTTP通信)
- 端口号的取值范围
- 注明端口号不能占!
- 一般都在动态端口号里面选
- 特殊端口号
- 端口:21 服务:FTP
- 端口:22 服务:Ssh
- 端口:53 服务:Domain Name Server(DNS)
- 端口:80 服务:HTTP
(2)序列号seq(随机生成)
拆包时保证数据不紊乱
(3)TCP标识位
表示这个发的包是干什么的
- SYN:建立链接
- ACK:回应标识
- FIN: 断开链接
- PSH: 数据包
- URG: 紧急指针
- RST : 重置(重传)
(4)滑动窗口机制
一种缓冲机制,先把数据全都放到滑动窗口里面,然后一点一点发。当网络不好时,会降速,压缩数据。根据网速带宽的大小,网络的快慢分解数据包,把数据包分解为适应这样网速带宽。
(5)检验方式
目的:保证数据做到正确传输
UDP实现正确传输可以依靠下面的方式(知识面广度,优缺点)
- 奇偶校验Parity Check
- bcc异或校验法(block check character)
- crc循环冗余校验(Cyclic Redundancy Check)
- md5校验和数字签名
- 海明码校验
(6)数据大小
- 局域网的链路层传输数据的最大长度是1518bit,包括帧的头尾部长度18bit(头14+尾4),IP头部长度为20bit,TCP头尾部长度为20bit,UDP头尾部长度为8bit
- TCP在局域网中传输数据的最长长度=1518-18-20-20 = 1460bit
- 广域网传输不限定大小,因为超过限定大小,会进行拆包发送
3.如何连接
(1)建立连接:三次握手
记录对方的ip和端口,正式通信时会自动的使用记录的ip和端口
- 第一次握手:建立连接时,客户端发送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连接成功)状态,完成三次握手
简述:客户端发起连接,先发一个SYN包,发送一个连接请求,再发一个序列号seq,保证我收到的是我想要连接的机器给我回复的包。服务器回复一个ACK包,表示已经建立和客户端的读写通道,再发一个SYN包,跟客户端建立连接,双发建立连接后,客户端再回一个ACK包。
三次握手缺点:容易被攻击
- dos攻击:不断给服务器发SYN包(连接请求),接着忽略服务器发回的ack包。让服务器不断等待客户端,达到负载
- 解决:等一段时间没有回应,就不再等待,断开连接。或忽略一直给自己发请求的IP。
- ddos攻击:开源破解软件,让下载软件的客户端向服务器发SYN包。
(2)断开连接:四次挥手
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
- 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
- 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
- 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
简述:客户端发一个FIN包请求断开连接,服务器回一个ACK包断开客户端项服务器的连接。服务器再发一个FIN请求断开连接,同时要发一个ACK包确定对方是之前跟自己断开连接的客户端,客户端再回一个ACK包确定断开连接。
(3)为什么是三次握手和四次挥手?
(4)dos、ddos攻击
4.如何保证可靠有序的传输
- 三次握手建立连接
- 拆包时SYN的设置确保了包的顺序正确
- 通过校验机制确保发送数据的准确
- 应答机制,也就是将数据发送给对方后,对方必须应答是否发送成功
- 使用“滑动窗口”机制,根据网络的好坏,控制发送的分组数据的大小
五. UDP协议:用户数据报协议
1.特点
无连接不可靠传输
2.UDP报文格式
- 局域网:UDP传输数据的最长长度 = 1518 - 18 -20 - 8 =1472bit
- 广域网:用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535- IP头(20) - UDP头(8)=65507字节。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误
3.协议特点
- 无连接的:发送数据之前不需要建立连接,减少了开销和发送数据之前的延时。(时效性比FTP协议好)
- 视频用UDP传,QQ消息也用UDP传(因为快,即使),文件传输用TCP传
- 尽最大努力交付:不保证可靠的交付,主机不需要维持复杂的链接状态表。
- 面向报文的:发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
- 没有拥堵控制(发完就收发完就收,不会堵塞)
- 支持一对一、多对一和多对多的交互通信(TCP只能一对一)
六. TCP与UDP
传输方式:面向报文(发的报文格式)
首部开销:就是报文格式在数据前面加的东西