TCP/IP4层协议包括应用层、传输层、网络层、链路层、当发送端发送数据的时候他们会对数据逐层进行一个封装,等到接受端再逐层进行一个分用,不同层对数据的处理也不同
应用层主要负责应用程序间的沟通;传输层主要负责进程中的通讯,能够确保数据可靠的从源端主机送到目标主机;保证数据的安全传输;网络层主要负责地址管理和路由选择;链路层:相邻主机间的数据传输;
应用层主要包括HTTP协议和HTTPS(协议格式:首行、头部、空行、正文);HTTP是一种明文传输协议其本质就是将多个对象按照Jason字符串的方式进行组织然后传输数据;但由于HTTP协议是明文传输,所以不安全;HTTPS是在HTTP的基础上增加了SSL加密来保证其安全性;
SSL加密主要通过两个手段:1、就是身份验证,2、就是加密传输;身份验证的方法就是服务器通过第三方的CA认证,就会给这个服务器颁发一个CA证书,当客户端与服务端建立链接以后,服务端就会把这个证书发送给客户端进行解析来证明服务器的正确性;
但这个方式只能保证服务器是对的,黑客还可以再通信过程中进行数据拦截;于是还要对传输的内容进行加密;主要方式有对称加密和非对称加密;而HTTPS是采取了对称加密和非对称加密结合的混合加密方式。通讯双方首先通过非对称加密对传输方式进行加密,等协商好传输方式再通过对称加密进行数据传输
传输层主要包括UDP/和TCP;他俩主要保证数据传输的安全性。UDP其特性无连接不可靠面向数据报;TCP有连接/可靠/面向字节流;意思就是UDP在通信的时候通信双方不需要与对方建立连接,只需要知道对方的IP地址就可以,但传输的数据不保证安全性和有序性;TCP则需要通信双方建立连接,同时TCP的数据传输相对于UDP来说虽然传输速度慢,但更加安全;因此视频传输一般选择UDP,文件传输一般选择TCP;
网络层主要负责路由选择、拥塞控制、以及地址管理;地址管理主要设计的是NAT网络地址转化技术,它的思想是将多个用户组到一起,由一个路由器来管理;私网访问外面的公网则需要通过路由器来进行转化,他会把私网的IP通过自己内部的路由表进行映射,因此所有私网内的客户端都是通过一个路由器也就是一个IP地址与外部相连(IP地址=网络号+主机号);
路由选择则是因为一个主机到另外一个主机之间的通讯路线不是唯一的,所以会选出一条最合适的路线来建立通讯(路由算法)
拥塞控制——意思就是在刚开始不知道网络状态的情况下不要发送过大的数据避免丢包。采取一种慢启动快增长的数据传输方式,刚开始传很小的数据来探测网络状态,然后逐步增大数据传输量。
链路层的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层;因为链路层遵循的是以太网协议,所以负责相邻设备之间的数据传输;(谈到相邻谁被之间的数据传输就得谈到ARP协议;)
mac地址:网卡上的物理硬件,在电脑出场的时候就设定好了
源端+对端mac:表示了哪两个相连的设备
上层协议类型:用于对数据的解析
校验:验证数据是否一致
补充知识:
1、对称加密(AES)和非对称加密(RSA)的区别
对称加密:是通信双发采取同种秘钥,比如抗战的时候双方就用同一本书对情报进行加密和解密;这样虽然效率高,但是别人如果拿到这个秘钥也能获取内容;
非对称加密:是服务器生成一个公钥和私钥,服务器把公钥传给客户端以后,客户端把数据通过公钥加密,这时加密文件只有私钥可以解密。别人拿到数据也没用;安全度高,但效率低
accept函数用了接收一个连接,内核维护了半连接队列和一个已完成连接队列,当队列为空的时候,accept函数阻塞,不为空的时候accept函数从上边取下来一个已完成连接,返回一个文件描述符
send函数用来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答,send的作用是将要发送的数据拷贝到缓冲区,协议负责传输。
recv函数用来从TCP连接的另一端接收数据,当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,然后从缓冲区中读取接收到的内容给应用层。
。
1、浏览器中输入URL,浏览器会根据DNS协议将URL解析为IP地址,首先主机会查询DNS的缓存,如果没有就给本地DNS发送查询请求查看本地的host文件。如果还没找到,向根域名服务器发送查询请求,直到找到域名对应IP
2、得到IP地址后,浏览器就要与服务器通过三次握手建立一个http连接。然后服务器对该请求进行一个响应回复,并把对应的 html 文本发送给浏览器;
用到什么协议
1、输入URL之后,浏览器需要将URL解析为IP地址,解析需要用到DNS协议。2、DNS协议是基于UDP的,需要用到UDP协议。
3、浏览器需要与服务器建立HTTP连接,需要用到HTTP协议。
4、HTTP生成GET请求报文,传给TCP处理,需要用到TCP协议。
5、TCP层可能会对HTTP数据包分片,分片是根据路径最大传输单元MTU和最大报文段长度MSS的。然后TCP数据包发送给IP层,需要用到IP协议。
6、IP层经过路由选择,一跳一跳发送到目的地址。一个网段内的寻址通过以太网协议实现(也可以是其他物理层协议,如PPP,SLIP),以太网协议需要知道目的IP地址的MAC地址,需要ARP协议。
以太网是最底层的协议,规定了电子信号如何组成数据包,解决了子网内部的点对点通信(能解决单个局域网内点对点通信)
补充知识:
1、域名解析流程:先查看浏览器缓存中有无记录,再查看本地host文件有无存储。最后去本地域名服务器进行查询;
2、URL:协议:用户名:密码@服务器IP:端口/资源路径
HTTP协议端口是80,HTTPS协议端口是443
协议格式:首行(请求方法——url(协议、用户密码、i、端口)——协议版本)、头部、空行、正文
.HTTP是一个应用层协议,在传输层使用tcp协议进行传输,因此我们说http协议本质是一个tcp协议
HTTP是一种明文传输协议其本质就是将多个对象按照Jason字符串的方式进行组织然后传输数据;但由于HTTP协议是明文传输,所以不安全;HTTPS是在HTTP的基础上增加了SSL加密来保证其安全性;
SSL加密主要通过两个手段:1、就是身份验证,2、就是加密传输;身份验证的方法就是服务器通过第三方的CA认证,就会给这个服务器颁发一个CA证书,当客户端与服务端建立链接以后,服务端就会把这个证书发送给客户端进行解析来证明服务器的正确性;
但这个方式只能保证服务器是对的,黑客还可以再通信过程中进行数据拦截;于是还要对传输的内容进行加密;主要方式有对称加密和非对称加密;对称加密:是通信双发采取同种秘钥,比如抗战的时候双方就用同一本书对情报进行加密和解密;这样虽然效率高,但是别人如果拿到这个秘钥也能获取内容;非对称加密:是服务器生成一个公钥和私钥,服务器把公钥传给客户端以后,客户端把数据通过公钥加密,这时加密文件只有私钥可以解密。别人拿到数据也没用;安全度高,但效率低而HTTPS是采取了对称加密和非对称加密结合的混合加密方式。通讯双方首先通过非对称加密对传输方式进行加密,等协商好传输方式再通过对称加密进行数据传输
补充知识:
1、对称加密(AES)和非对称加密(RSA)的区别
对称加密:是通信双发采取同种秘钥,比如抗战的时候双方就用同一本书对情报进行加密和解密;这样虽然效率高,但是别人如果拿到这个秘钥也能获取内容;
非对称加密:是服务器生成一个公钥和私钥,服务器把公钥传给客户端以后,客户端把数据通过公钥加密,这时加密文件只有私钥可以解密。别人拿到数据也没用;安全度高,但效率低
2、客户为什么信任第三方整数?
因为证书还是比较安全的;如果第三方掉包了CA机构的证书,但由于证书里包含了客户端的请求网站信息,因此客户端只要拿证书里的域名和自己的请求域名进行对比,如果不一致证明整数被掉包;
Jsoncpp库的认识:将多个数据对象序列化为json格式的字符串,或者将json格式的字符串反序列化得到各个数据对象
Json::Value ——中间的数据交换类
Json::Writer——实现序列化,将Json::Value对象中的数据组织成json字符串
Json::Reader——实现反序列化,将json字符串,解析得到
举例:
定义Value的对象,Json::Value value;
value[姓名] = “张三”//把姓名的美容存到value再通过反序列化变成json字符串
Json::Writer writer;
string writer(Json::Value);把value类型传进去,最后返回string类型的字符串
HTTP协议版本有0.9/1.0/1.1/2.0;
0.9版本的时候没有什么协议格式,只支持GET请求方式,只进行html数据传输;
1.0版本的时候http有了基础的协议格式,支持了GET/POST/HEAD三种请求方法。但1.0的工作方式是短连接,每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,不支持keepalive;
1.1版本的时候支持长连接,一个TCP连接可以允许多个HTTP请求;(可以是文本也可以是二进制)
2.0的版本 则是一个彻底的二进制协议,使用了多路复用的技术,做到同一个连接并发处理多个请求。消除了头部拥塞的可能。(因为HTTP1.1是文本格式的数据,以换行符来分割每一条数据,所以它是串行化的,而HTTP2.0是一个二进制的帧协议,每个帧都有自己的标识符,对端通过标识符来判断属于哪个请求,因此不需要串行化的处理,所以一个帧阻塞可以处理其他帧;)
长短连接&&如何控制
长连接:一个tcp连接中允许多次HTTP请求;
短接连:一次请求得到响应就会立马关闭这个连接;
使用头部字段中的connection字段进行控制:keep-alive就是长连接,live就是短连接
http缓存指的是:当客户端第一次向服务器请求资源,浏览器就会对资源进行缓存,如果第二次请求相同资源,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。减少了服务器与客户端之间的通信次数,降低了网络延迟,提高了用户体验
缓存的基本工作流程:请求资源先看看自己有没有缓存,如果没有就问服务器索取,如果有就要检查缓存的新鲜度,看缓存是否过期如果没过期直接用,如果过期了先和服务器进行验证,因为不一定真的过期了,如果真的过期了就重新向服务器索取,如果没有就直接用;
如何检查是否新鲜?
第一次访问,通过expires设置缓存有效期,然后每次访问的时候通过$_SERVER的HTTP_IF_MODIFIED_SINCE变量判断是否过期,如果未过期,返回304表示扔在缓存有效期内,则不需要重复请求资源。(Last-Modified和expire配合使用,通过Last-Modified设置上次修改时间为当前时间)
优点:使资源可以重复使用,减少了服务器与客户端之间的通信次数,降低了网络延迟,提高了用户体验。
请求头中都有哪些属性是关于http缓存的:(两个控制缓存操作的首部:pragma、cache—control);
1、cache_control:里面有个max-age用来代表缓存的最长时间;
2、no-cache:表示可以进行缓存,但每次使用前都要和服务器确认
3、no-store:不能缓存,每次和服务器请求资源4
4、expire:表示缓存的过期时间,如果在时间内就表示未过期;因此不会和服务器要求更新资源
首先GET和POST都是HTTP协议中的一种请求方法,不过它们两个还是略有区别的;GET主要用于请求一个资源实体,而POST主要用于向服务器提交数据;
这是因为GET请求不安全,他会将数据放在URL后面,同时会将请求的参数保存在浏览器记录中很容易被获取;因此一般GET不用于提交数据,而是获取一个资源;而POST将数据放在请求主体中,并且不会将参数保存在浏览器记录了因此相对安全;所以POST一般被用于请求提交数据。
区别:
1、get参数通过url传递,post放在request body中。
2、get请求在url中传递的参数是有长度限制的,而post没有。
3、get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
4、get请求只能进行url编码,而post支持多种编码方式。
5、get请求会浏览器主动cache,而post支持多种编码方式。
6、get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
(head请求功能与GET类似,但是相比于GET,响应中不需要正文 ;)
(GET:首行、头部、空行、正文)
(OPTIONS、put、delete、connect)
1XX:描述信息,请求正在处理
2XX:表示本次请求正确处理 200 - 请求成功,已经正常处理完毕
3XX:表示本次请求重定向到新的位置 301-永久重定向 302-临时重定向
4XX:表示客户端错误 400-请求不理解 403-请求被拒绝 404 -请求找不到
5XX:表示服务端错误
200 - 请求成功,已经正常处理完毕
301 - 请求永久重定向,转移到其它URL 302 - 请求临时重定向
304 - 请求被重定向到客户端本地缓存
400 - 客户端请求存在语法错误
401 - 客户端请求没有经过授权
403 - 客户端的请求被服务器拒绝,一般为客户端没有访问权限
404 - 客户端请求的URL在服务端不存在
500 (服务器内部错误) 服务器遇到错误,无法完成请求
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应
503 (服务不可用) 服务器目前无法使用
UDP/和TCP;他俩主要保证数据传输的安全性。UDP其特性无连接不可靠面向数据报;TCP有连接/可靠/面向字节流;意思就是UDP在通信的时候通信双方不需要与对方建立连接,只需要知道对方的IP地址就可以,但传输的数据不保证安全性和有序性;TCP则需要通信双方建立连接,同时TCP的数据传输相对于UDP来说虽然传输速度慢,但更加安全;因此视频传输一般选择UDP,文件传输一般选择TCP;
除了这些普通的区别
TCP还有个特性而UDP没有,就是tcp有可能导致粘包问题:粘包问题意思就是很多数据包粘成一个包,原因一般有两个:1、发送方为了将多个包发送给对方一般会采用**Nagle算法(将多个间隔小数据量小的包组成一个包)**进行优化导致粘包问题;第二个原因是接收方送缓冲区取数据的时候不及时,导致缓冲区的数据报粘在一起;UDP不存在粘包情况(是因为UDP的是面向数据报,数据都是整条交付,所以不存在粘包情况)
cookie和session都是用来存储用户信息,不过它们最大的区别就是cookie存在客户端,而session存在服务端。
如果浏览器是cookie,那么服务器会创建一个cookie保存在浏览器,用来存储用户信息。下次访问的时候,用户会携带cookie,服务器根据cookie中的数据不同来进行区分。
如果浏览器是session,那么为了保护客户信息的安全,会将session存储在服务器,其中保存客户的信息。而只把session id返回给用户。下次访问的时候服务器会根据session id来进行区分。
因此相比之下session更加安全。
第一次握手:客户端给服务端发送一个SYN报文,并说明客户端的初始化序列号ISN,此时客户端处于SYN_SEND状态
首部的同部位SYN =1,初始序列号seq = x。
第二次握手:服务器收到客户端的SYN报文后,把客户端的ISN+1作为ACK值返回。表示自己已经收到了客户端的SYN。同时也会发送自己的SYN报文,并指定自己的ISN。此时服务器处于SYN_RCVD状态
在确认报文端中SYN = 1,ACK = x+1. seq = y
第三次握手:客户端收到SYN报文会发送ACK。也是把服务器的SYN+1作为ACK的值。此时客户端就处于ESTABLISH状态。服务器收到客户端的ACK后也进入ESTABLISH状态。此时两端就建立了通讯。
三次握手的作用
1、检查双方是不是都具有收发数据的能力;
2、防止syn攻击,如果对每一个链接都建立套接字服务器资源就会被耗尽,因此只对完成三次握手的请求建立套接字;
3.通讯双方交换初始化序列号;
第一次挥手:客户端发送了一个FIN报文,此时客户端处于FIN_WAIT1状态。(WAIT1状态等待ACK)
FIN = 1,序列号 = u;
第二次挥手:服务器收到FIN之后会发送ACK报文,且把客户端的序列号+1作为ACK报文的序列号,表明已经收到了。次数服务器状态为close_wait状态。客户端收到ACK后进入FIN_WAIT2状态。(wait2等待FIN)
确认报文(确认号ack = u+1 序列号seq = v)
第三次挥手:服务器发送FIN信号。此时服务器处于LAST_ACK状态。
第四次挥手:客户端收到FIN信号后。同样会发送一个ACK。此时客户端进入TIME_WAIT状态。然后等待一段时间(2MSL)进入CLOSE状态释放资源。而服务器收到客户端的ACK以后才会进入closed状态。
等待2MSL
1、保证服务器正常进入CLOSED状态。
因为在第四次挥手的时候ACK信号可能丢失,此时服务器会重新发送FIN。等待2MSL就是为了防止ACK丢失重发FIN的时候客户端已经关闭了,从而导致无法回复。而服务器必须得到客户端的回复才会进入CLOSED状态。
2、确保新的连接中不会有旧的报文
当客户端直接关闭,此时ACK丢失重新发送FIN,但再次过程中客户端关闭后资源释放有新的连接在原来的地址上,就会收到旧报文的FIN。
大写和小写ack的代表的意义不同;
ACK是标志位,表示本方确认了链接;
而ack是确认编号,是对方seq+1,表示本方已经收到了你发送的全部数据
TCP实现数据的可靠传输通过,面向链接机制、确认应答机制、超时重传机制、包序管理机制、数据一致性校验机制、滑动窗口机制、和拥塞控制几个机制来实现的
1、面向连接:确保通信双方都具有收发能力
2、确认应答机制:每发送一条数据都要求收方进行确认回复,表示数据安全到达;(就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。)
3、超时重传机制:等待一定时间没有回复则认为数据丢失重新发送防止数据丢失
4、包序管理:会根据初始化序列号来对数据进行一个组织,确保数据的有序性
序号:告诉对方本条数据的起始序号是多少
确认序号:接收方回复发送方,告诉发送方下次就从这个位置发送数据就行
5、数据一致性校验:会通过校验算法来验证发送的数据和接收的数据是否一致;如果不一致则重新发送(CRC循环校验算法)
接收端在接收到数据后,对其进行处理。如果发送端的发送速度太快,导致接收端的结束缓冲区很快的填充满了。此时如果发送端仍旧发送数据,那么接下来发送的数据都会丢包,因此还会有流量控制协议来控制流量的传输大小。
6、滑动窗口机制是一种为了防止发送方发送数据过多,而导致接收方数据溢出的一种流量控制机制
7、拥塞机制就是采用一种慢启动快增长的数据发送模式,刚开始传很小的数据来探测网络状况,然后逐步增大数据传输量,防止刚开始传输大量数据导致数据丢失。
因为UDP本身不可靠,所以UDP(在应用层)实现可靠传输的方式是模仿TCP(传输层)的可靠性传输。
1、模拟实现三次握手建立链接
2 引入序列号, 保证数据顺序;引入确认应答, 确保对端收到了数据; 引入超时重传, 如果隔一段时间没有应答, 就重发数据保证数据不会丢失。
3、添加滑动窗口机制和拥塞机制,防止在数据传输的传的太多导致丢包。
因为TCP是面向连接的,通信双方必须都具备收发数据的能力才能通讯。如果两次只能保证客户端知道双发的收发正常。所以两次不行;
而ACK和SYN可以同时发送,因此不需要进行四次握手。
注意:因为客户端和服务端是互相不知道对方接收、发送能力是否正常的
第一次:客户端发送数据服务端接收
客户端只知道:客户端发送正常 服务端知道:客户端发送正常,自己接收正常
第二次:服务端回复数据,客户端接收
此时客户端知道了:客户端接收、发送数据都正常;服务端接收、发送也都正常
服务端知道:服务端接收、发送数据正常。此时如果客户端不回复来进行第三次握手,服务端是不清楚客户端是否具备接收数据能力的。
半连接队列就是用来存储还没有完全建立通讯链接的队列;
服务器第一次收到客户端的SYN后,就会处于SYN_RCVD状态。此时双方还未完全建立链接。服务器就把此种状态下的连接放在一个队列中。这个队列就是半连接队列。(
这其实也是服务器的一种保护措施,因为TCP会为每一个通信建立socket套接字,所以当有大量恶意主机请求但不完全建立链接的时候,服务器先把这些请求放入半连接队列中,如果半连接请求满了就会丢弃新的链接请求;防止服务器资源被耗尽
全链接队列:已经完成三次握手建立了通讯的连接
不是!
三次握手的一个重要功能就是客户端与服务端交换ISN,以便让对方知道接收数据的时候如何按序号进行组装。序列号如果固定很容易被攻击者猜出后续的确认号。因此是动态的
第一次、第二次不可以携带数据。第三次可以。
因为前两次都不知道客户端和服务端是否有接收发送数据的能力,而前两次握手的目的也只是检测对方是否正常。所以如果携带大量数据服务器就要为可能不正常的客户端开辟空间存储数据。
而第三次握手时客户端已经就绪,知道了服务器是正常的。也就可以收发数据
SYN攻击就是恶意客户端不停的给服务器发送SYN请求,导致服务器资源耗尽;
因为TCP链接会为每一个请求建立socket结构体。而恶意主机的大量的SYN会导致服务器建立大量的无用socket,从而使资源耗尽。
解决办法
1、采用未完成队列机制:把未完成三次握手的连接放入未完成队列中。当恶意主机的SYN请求导致未完成队列满了时,对于新的SYN请求直接丢弃。
2、设置SYN Cookie
给每一个请求分配一个cookie,如果短时间内连续收到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址发来的包一概丢弃
(如果对方关闭,再发送信号会出现什么情况)
因为对方关闭(相当于管道中对方的读端关闭写端写满缓冲区就会触发SIGPIPE信号,操作系统会强制关闭写端),
客户端继续写的话,会触发SIGPIPE信号,操作系统会强制关闭客户端
确保新的连接中不会有旧的报文
因为在第四次挥手的时候客户端给服务端的ACK信号可能丢失,当客户端直接关闭,此时ACK丢失重新发送FIN,但在此过程中客户端关闭后资源释放有新的连接在原来的地址上,就会导致新的链接收到旧的FIN
问再说(
保证服务器正常进入CLOSED状态。
因为在第四次挥手的时候ACK信号可能丢失,此时服务器会重新发送FIN。等待2MSL就是为了防止ACK丢失重发FIN的时候客户端已经关闭了,从而导致无法回复。而服务器必须得到客户端的回复才会进入CLOSED状态。)
当客户端与服务器一段时间没有数据通讯时候会激发保活计时器。此时客户端会按一定的频率向服务器发送ACK,如果得到回复则更新计时器。如果一定时间没有回复则判断连接接断开。
CLOSE_WAIT是被动关闭方收到FIN报文出现的状态,正常情况应该调用close后进入LAST_ACK状态。因此如果出现大量CLOSE_WAIT说明程序中可能服务端关闭连接时没有关闭套接字释放资源。
(如果将大量CLOSE_WAIT:查代码。因为问题出在服务器程序里头啊。)
TIME_WAIT是主动方出现的状态,大量出现TIME_WAIT说明这台主机上进行大量的套接字主动关闭。
解决方法:调整TIME_WAIT状态的等待时间
滑动窗口机制是一种为了防止发送方发送数据过多,而导致接收方数据溢出的一种流量控制机制;
其底层原理:在三次握手过程中,发送方会根据接收方的缓冲区大小来确定一个窗口大小;这个窗口大小代表了吞吐数据的能力,然后是协商出一个MSS(最大数据段大小)一次发送MSS大小数据到缓冲区;如果从缓冲区取出数据窗口就会向后滑动,直到发送完整个数据;
滑动窗口机制中的协议
停等协议:每条数据收到回复后才会发送下一条,网络状态差的情况。(类似于0.9版本的http协议)
回退n步协议:从丢包的位置开始,往后的数据重新进行传输。网络状态一般情况。
选择重传协议:那个包丢了重传那个。网络状态好。(相信网络状态好,其他的不会丢)
拥塞机制一种为了防止发送方发送数据过多而导致接收方数据溢出的一种流量控制机制;
其原理就是采用一种慢启动快增长的数据发送模式,刚开始传很小的数据来探测网络状况,然后逐步增大数据传输量。
因为TCP的安全机制会导致性能降低,所以采用快速重传机制、捎带应答机制、延迟应答机制来提高性能;
快速重传机制:一般情况下数据丢失等到超时才会重发,这个时间比较长、效率低。快速重传机制就是在丢失前面数据的情况下收到的后面数据,则认为数据有可能丢失。此时按一定频率向发送方要求重新传输。当发送方收到三次这样的请求则认为数据丢失。(为了避免数据只是延时到达,而不是丢失)
捎带应答机制:接收方每次会为收到的数据进行回复,但每次回复只是报头的一些信息,此时如果有数据刚好发送给对方就会把返回确认报头和数据组成一个报文一起发送。
延迟应答机制:tcp再采取滑动窗口机制传输的时候。当数据存储到缓冲区的时候不会立刻被取走,此时缓冲区剩余空间变小,如果立即进行确认回复就会导致窗口变小,传输吞吐量降低。
思想:收到数据稍微延迟一会,当数据被取出的时候再进行应答,此时缓冲区剩余空间不变。窗口大小也不变,保持吞吐量。
粘包问题是指多个数据报粘成一个包的;
其原因一般有两个;
第一个是由于发送方为了将更多数据报发送给对方会采用Nagle算法进行优化,导致粘包问题;
第二个是接收方从缓冲区取出数据不及时也会导致粘包问题;
解决方法:
1、数据定长。(但数据定长就会导致过短的数据需要补全)
2、在应用层头部定义数据长度
Nagle算法:是一种将多个间隔小,数据量小的包合并成一个大包的优化算法;
注意:UDP不存在粘包情况(是因为UDP的是面向数据报,数据都是整条交付,所以不存在粘包情况)
NAPT
NAT是网络地址转化,而NAPT是网络地址端口转化;
NAT是将内部地址转化成外部地址来与服务器进行通信,而NAPT是多个内部地址使用同一地址的不同端口转换成外部地址进行通信的。NAPT发送数据的时候会在源地址和目标地址上加上端口号(比如源地址:192.168.1.2:1010,目标地址:200.1.1.2:1020),回来的数据也是一样。
问再说
都是为了当IP地址不够用的 时候,为了节省IP地址而采用的网络地址转化技术。是将多个用户主机组成私网,共用一个路由器的公网IP,通过NAT将私网IP转化成公网IP与外界通讯。
如何转化
路由器有个映射表,当有私网IP请求外界资源的时候,就会通过路由器的映射表将其转化成公网IP,当服务器进行数据回复的时候也是通过映射表找到请求主机。
A:最高位是0的8位网络号,24位主机号; 网络号范围:0-127(00000000-01111111) 主机号:0.0.0.0-127.255.255.255
A类通常用于大型网络
B:最高位是10的的16位网络号,16位主机号; 网络号范围:128.0-191.255;
C:高三位是110,21位网络号,8位主机号;网络号范围:192.0-223.255.255
(早期这种方式过于粗糙,造成了大量的地址浪费。因此再次基础上使用子网掩码进行网络划分)!
子网掩码(必须由连续的二进制1组成):子网掩码决定了一个网络中可以有多少个主机号
子网掩码取反可以得到最大主机号;子网掩码与IP地址得到网络号
ARP协议是属于链路层相邻设备之间传输锁用的协议,它的作用就是通过IP地址获取到MAC地址;当A主机想与B主机通讯,就会向相邻的设备广播ARP请求,相邻设备收到请求会把目标IP和自己的进行匹配,如果匹配成功则把自己的MAZ地址填入ARP请求中,双方建立通讯;
APR攻击:
当你广播ARP请求会有假冒的IP对你进行回复,如果不进行辨识就会和恶意主机建立通信
解决方案:防火墙中会把信任的相邻设备组成MAC白名单;收到恶意主机的mac发现和白名单不匹配
RARP:通过MAC地址获取IP地址