tcp 粘包和拆包:
udp不会发生粘包和拆包(udp基于报文,首部指出报文长度),应用层可以很好的将不同数据报文区分开。避免粘包拆包。
tcp:是字节流,没有边界,
大型网络游戏 一般采用UDP传输协议,传输速度快,不会浪费时间和带宽。对丢失的包进行重传。
TCP适合回合制等节奏慢的游戏,比如炉石传说。
https://blog.csdn.net/tajianyi2338/article/details/108218896 (多人游戏网络同步技术)
https://blog.csdn.net/a352614834/article/details/95003429 (网络同步技术理解)
https://zhuanlan.zhihu.com/p/56923109 (网络游戏同步技术概述)
网络同步:主要有2种,帧同步和状态同步。
1.帧同步:帧锁定同步算法。客户端和客户端每一帧发送 cmd,客户端收到所有输入后,根据这些cmd模拟一帧。网络延迟和网络状况最不好的玩家有关。
2.状态同步:服务器每一帧把客户端的输入收集并计算结果发送给客户端,客户端只负责表现结果。
命令同步:要即时同步,比如用户移动。
状态同步:可以按照一定频率 区分细节度发送。
同步对象:同服,同屏, 单个用户。。
对象同步:增量同步(第一次创建对象需要完整的信息,以后只是少量变化量即可)减少冗余数据传输。
关键游戏逻辑尽可能在服务端完成,做好加密,防止攻击。输入校验。。
对不同数据 采用不同的同步机制(消息分的十分细腻)小规模游戏 实时性可以要求高一些,大规模存在网络延迟,不存在“完全同步”。(消除 或者 隐藏延迟,玩家感受起来像没有延迟)
TCP接收 和 UDP接收的区别:
TCP是面向连接,发送传输都在掌握之中,基于字节; (保证安全,可靠,有序。。)
UDP发送数据报,客户端发送多少,就接收多少。无连接,知道ip port 网络可达就可以。。(容易乱套。。)不能保证有序,安全和可靠。
MSS(Maximum Segment Size,最大报文段长度)三次握手有一个目的就是协商MSS大小。一般来说,TCP报文携带的数据越多越好,网络传输底层数据链路层不能太大。
MTU,Maximum Transmission Unit,最大传输单元,链路层对这种帧长度的限制。
MTU是硬件层面属性 限制, MSS是软件层面,软件控制
ping命令:
命令本身是一个应用程序,属于应用层。
底层使用的是ICMP协议(Internet Control Message Control),用于在ip主机和路由器之间传递控制消息,网络状况 主机状况 等等, 属于网络层。
多路复用。。
多个TCP连接,复用指复用一个或少量线程,很多网络I/O复用一个或少量的线程来处理这些连接。
都是异步的事件驱动的网络模型,
———//
UDP如何实现可靠传输
UDP不属于连接协议,资源消耗少,处理速度快;
传输层无法保证数据可靠传输,只能通过应用层实现(实现方式一般也是参考tcp的操作)
应用层udp可靠传输设计:
1.添加seq , ack机制, 确保数据发送到对方;
2.添加发送方和接收方的缓冲区,
3.定时检查任务 是否需要重传数据。
开源的可靠传输的UDP程序:1.RUDP(Reliable UDP,对拥塞控制的改进,重发机制)2.RTP(Real Time Protocol),3.UDT(UDP-based Data Transfer Protocol)
socket编程:
connect(相当于3次握手过程。)
close(四次挥手,客户端或服务端任一方触发)
客户端:
(1)socket(), 创建一个socket;设置ip和prot,
(3)connect(), 连接服务器。
UDP 用 struct sockaddr。
(4)send() 和 recv(), 收发数据, 或read()和write()
(read write是linux最底层的读写操作,往fd缓冲区写内容;send, recv增加了flag字段,可以选择模式。。)
UDP recvFrom(), sendTo().
(5)close(), 关闭连接。。
服务端:
(1)socket(), 创建一个socket;
(2) bind(), 设置ip和prot,
(3)设置允许的最大连接数,listen()
(4) 接收客户端上来的连接, accept()
accept 从已完成连接队列头返回下一个已完成连接。输入参数为:连接放进程协议地址(fd,地址和长度),成功时生成返回全新的描述符,表示与客户的连接。
(4)send() 和 recv(), 收发数据, 或read()和write()
UDP recvFrom(), sendTo().
(5)close(), 关闭连接。。
tcp连接中,解决异常断开的问题:
引入心跳机制,设计一个线程,定时发送心跳包,收到返回时确认对方是否在线。(业务层做心跳包比较好)
TCP: 特点:面向字节流, 面向连接,可靠传输。
TCP可靠性如何保证:
0.连接管理
三次握手, 四次挥手,是保证可靠性的前提。
1.校验和
计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。
发送方:在发送数据之前计算检验和,并进行校验和的填充。
接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对;
2.序列号
TCP将每个数据包都进行了编号,这就是序列号。
序列号的作用:
a、保证可靠性(当接收到的数据总少了某个序号的数据时,能马上知道)
b、保证数据的按序到达
c、提高效率,可实现多次发送,一次确认
d、去除重复数据
3.确认应答
TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
4.超时重传
发送方没有介绍到响应的ACK报文原因可能有两点:
数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到。
接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。
TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制。简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。
6.流量控制
7.拥塞控制
tcp传输顺序保证:
2.缓冲区,当某个片段按照顺序发送后,发送方会将已发送的数据片段暂时保存在缓冲区内,并为每个已发送的数据设置一个时间区间。
3.主要依靠序列号。
当接收方收到正确的符合顺序的数据片段后,会优先对数据片段做完整检验,如确认无误,再把数据片段交给上层协议,并给发送方一个TCP片段反馈信息用来告知(ACK acknowledge)发送方:我已经接收到这个片段了。这个TCP片段被称为ACK回复。举个例子:发送的第一个片段序列号为T,其对应的ACK回复则为T+1,也就是接收方要接收的下一个发送片段的序列号。
4.后处理。假设在规定的时间区间之内发送方收到接收方的TCP片段反馈信息,则发送方可以释放缓冲区的数据,如若超时未收到应答,发送方则重新发送数据,直到收到应答,或者重发数据次数达到上限为止。
标志位:共有6种标志位,SYN(建议连接, 三次握手需要),ACK(用来确认, 建立连接 关闭连接都需要),PSH(传输), FIN(结束, 四次挥手需要), RST(重置), URG(紧急)
UDP头部结构:
UDP头部结构中各部分的作用:
(1)16位源端口号 记录源端口号,在需要对方回信时选用。不需要时可用全0。
(2)16位目的端口号 记录目标端口号。这在终点交付报文时必须要使用到。
(3)长度 UDP数据报的长度(包括数据和首部),其最小值为8B(即仅有首部没有数据的情况)。
(4)校验和 检测UDP数据报在传输中是否有错,有错就丢弃。该字段时可选的,当源主机不想计算校验和,则直接令该字段为全0。当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给进程。如果接收方UDP发现收到的报文中目的端口号不正确(即不存在对应端口号的应用进程),就丢弃该报文,并由ICMP发送“端口不可达”差错报文交给发送方。
主动发起关闭的一方是time_wait, (TCP可靠性的体现。。)
time_wait的意义:!!!
原因:要经过2MSL(最大报文段生存时间返回变成close状态)
如何优雅的关闭连接。
https://blog.csdn.net/sunximei/article/details/119837753
网络编程中的close不优雅,
tcp将字节流分段打包(tcp数据包),一个包内的数据不是完整的消息(依靠seq(顺序)、ack(确认)来进行同步)
close不优雅的原因:是因为当fd句柄引用引用计数为0时,close关闭套接字直接返回,即使TCP发送缓冲区还有数据未发送完毕,即使TCP接收缓冲区还有数据未读取完毕。
shutdown: 终止连接,不关闭套接字。(直接触发tcp终止,发送FIN包)
优雅的方式:
使用setsockopt设置linger。
shutdown(不接受但可以发送)然后closesocket(不能接受也不能发送)
建立连接是三次,关闭连接却是四次??
答:(1)建立连接时,服务端在listen状态下收到SYN建立连接请求时,服务端把ACK和SYN放在一个报文里发送给客户端。关闭连接时,收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,自己也未必全部数据都已经发送给对方了;所以己方可以立即close,也可以发送数据后再发送FIN给对方表示同意现在关闭连接。。
己方 ACK 和 FIN 一般分开发送。。
为啥建立连接必须三次,不能是二次或四次???
三次是理论上的最小次数。。tcp必须建立连接 。。只有三次,才能证明client和server分别验证双方都具有正常的发送和接收能力。
四次太多,浪费资源,传输效率低。。。(使用理论最小值即可,三次。。)
三次握手的过程:
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
四次挥手的过程:
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。(状态位FIN=1,发送seq=J)
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。(状态位ACK=1,发送ack=J+1)
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。(状态位FIN=1,发送seq=K)
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。(状态位ACK=1,ack=K+1)
注意此时客户端并未进入CLOSED状态,为了防止服务延迟,需要等待2MSL的时间,然后进入CLOSED状态,因为如果客户端直接进入CLOSED了,如果网络异常,客户端就不能重重发数据。
—————
TCP 流量控制 和 拥塞控制
1.流量控制
防止发送数据过快 ,接收方来不及接收。
(发送方和接收方速度不相等,接收方来不及处理的数据放在缓冲区,缓存区满的时候,会丢掉一部分包, 因此需要控制发送方的发送速率)
流量控制方法:接收方给发送方发送确认报文时,带上win的大小(缓存区剩余空间大小,接收方窗口大小,单位是字节)
发送方收到之后,便会调整自己的发送速率;如果收到为0时(说明接收方没有空间了),发送方便不再发送。
、、、、、、、
win=0时,何时继续发送?
发送方定时去给接收端发送测试信息, (接收端也可以给发送端发送win>0的消息。。)
、、、、、
窗口大小,根据某种算法动态调整(根据网络环境、发送端发的拥塞窗口)。。 窗口太大也不好消耗大量内存),太小也不好(降低链路利用率,容易丢包) 接收窗口>=发送窗口
TCP滑动窗口,就是进行流量控制的方式。接收方设置滑动窗口大小(单位字节),发送方不得超过该大小。(发送滑动窗口 ACK=1)
2.拥塞控制
对资源的需求 超过了网络可以供应的资源, 网络中很多资源不足,网络性能就会明显变差,
防止过多数据注入到网络中,防止网络过载。
拥塞控制是一个全局的工作,主机 交换机等,都要考虑。涉及整个网络性能。(前提要知道网络中流量分布情况)
拥塞控制的代价:节点之间交换信息和各种命令,以便选择控制的策略和实施控制,会产生额外的开销。拥塞控制还会将一些资源分配给各个用户单独使用,使得网络资源不能更好的实现共享。
、、、、、
常用的拥塞控制的方法:
慢开始:
发送方维持一个拥塞窗口cwnd状态变量,拥塞窗口大小取决于网络拥塞程度,并且动态的变化。发送方让自己的发送窗口等于拥塞。
只要网络没有拥塞,拥塞窗口就可以增大一些,把更多的分组发送出去;网络出现拥塞,窗口就减小一些。
慢启动:开始时cwnd=1(开始只发送一个分组), 然后逐步加倍,
慢启动门限状态变量 ssthresh,
超过该变量:用拥塞避免算法;
小于该变量:用慢启动算法。
拥塞避免: 每次cwnd +1, 缓慢增长,不是加倍。
出现拥塞时, 都会把分组数减少一半。
快重传、 快恢复:
快重传:要求接收方每收到一个失序的报文段后就立即发出重复确认(尽早的让发送方知道,有报文段没有到达对方),
一连收到3个重复确认,立即重传对方尚未收到的报文段,
快恢复: 慢启动门限状态变量 减半。。
(上面操作, 避免网络拥塞,提高网络吞吐量。。)
流量控制:只是点对点的,两端之间的问题,抑制发送端的发送速率。使接收端来得及接收。
1。epoll(linux)
任务队列中的任务,需要主动触发执行,
iocp。(window)
客户端发送过去到队列中,IOCP自动执行,通过一个接口获取完成事件通知即可(给子进程。。)
网络相关
!!!!!
socket函数, TCP和UDP发送同样的1M数据到接收端,有啥区别???
socket通信流程:
两个进程能够进行通信的方法:就是在网络中唯一标识一个进程。网络中唯一标识一个进程就是用 ip + 协议 + 端口,标识完两个进程就可以用socket通信了。
socket:套接字,是在应用层和传输层之间的一个抽象层,把tcp/ip复杂的操作流程 抽象成为几个简单的接口,供应用层调用,从而实现进程在网络中的通信。
TCP 字节流,(byte stream)
UDP datagram(数据报)
网络编程中,send函数怎么实现。。阻塞和非阻塞。。
https://www.cnblogs.com/inception6-lxc/p/9152691.html 网络每个层介绍。
TCP 滑动窗口机制, 拥塞机制, 流量控制。。???
阈值怎么设置。????
----——————-
http:(HyperText Transfer Protocl,超文本传输协议), 网络应用层最广泛使用的一种网络协议,所有www文件必须遵守这个标准,发送传输html文件使用。底层基于TCP传输协议。
http 无连接(每次只处理一个,结束就断开,节省传输时间),无状态(也是提高响应,前后处理都是独立的,没有记忆,不会记忆上下文。。)
http结构:请求报文 = 请求行(url) + 请求头header + 请求体body
https://www.cnblogs.com/lifan1998/p/14325065.html?utm_source=tuicool
header:
connection: 是否需要持久连接。 keep-alive或http1.1就表示进行持久连接。
keep-alive: 可以设置连接的时间(在该时间内,连接不会断开)
!!content-length: web服务器返回消息正文的长度(动态页面用transfer-encoding!!!) 用来判断消息大小,读取处理是否完毕。。。!!!
content-type: 返回数据类型和字符编码格式。
Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
3.HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
(1)建立TCP连接;(2) Web浏览器向Web服务器发送请求命令;(3)Web浏览器发送请求头信息;(4)Web服务器应答;(5) Web服务器发送应答头信息;(6)Web服务器向浏览器发送数据;(7)Web服务器关闭TCP连接
http,tcp,ip三层协议如何判断接收端消息接收完毕??
(1)HTTP协议的服务端响应报文里有Content-Length字段,明确了报文的长度。客户端应该是通过这个来判断的。
(2)TCP协议里接收方要回传确认号。如果双方各自向对方请求下一个数据包,却没有响应对方的请求,那么说明数据传完了。有时数据发送方如果发送完毕,会发出中断连接请求。对方也就知道已经发送完毕了。(3)IP协议是无连接协议,不会考虑对方是否“发送完毕”。如果IP数据报被分片发送,那么只有最后一个分片的“还有分片(M)”flag置为0,之前的分片相应flag都置为1。
4.http的两种模式:
普通模式:非Keep-alive模式,每次请求应答都新建一个连接,完成后断开连接(http协议是无连接的协议)
keep-alive模式:持久连接,连接重用,客户端到服务器端的连接持久有效,出现对服务器的后继请求时,避免重新建立连接
https 是 http的安全版,http中加入SSL层(依靠证书来验证身
份,为浏览器和服务器直接提供通信加密) 端口443
https保证传输安全:
浏览器输入网址,访问服务器,用的啥协议,详细过程是啥????
1.域名解析协议DNS,将url解析成ip地址,(dns是属于udp协议)(先查dns缓存,缓存没有就请求dns服务器)
2.http协议,得到ip后,浏览器和服务器建立http连接,产生get报文请求,tcp协议处理(后面就一层层往深处去,服务器从底层一直往上解析)
FTP服务器???
底层tcp传输层建立连接, ftp加了一些功能:身份认证、浏览主机目录信息、维护多个tcp连接状态(文件传输结束时关闭,再次传输时重新建立)
ARP协议(地址解析协议),将ip地址转换为mac地址,(属于IP层,网络层)
RARP协议(反ARP),mac地址转换为ip地址。(属于mac层,数据链路层)
TCP的状态转换11种状态?有哪些?time_wait状态。???
(主要是 3次握手、4次挥手中的不同状态)
RPC:(区别于http的一种),服务间的远程调用的方式,(Remote Produce Call), 早起webservice就是基于RPC的典型案例。 工作在会话层(跨越了传输层和应用层)
特点:基于原生TCP通信,速度快,效率高,自定义数据格式,
报文体积小,传输效率高;可以基于thrift实现高效的二进制传输。。。自带负载均衡策略。。
是什么?? 一种进程间的通信方式,允许像调用本地服务一样调用远程服务。(只管调用就行,不用管通信、传输、编码格式细节。。)只需要关心谁、在什么位置、提供了什么样的接口服务即可。
RPC和http:底层都是基于socket(socket是封装了TCP通信)。http的话,就封装的httpclient。都可以实现远程调用,服务调用服务,
不同点:http通用性比较强,只需要json restful风格的数据即可。。(http协议数据封装太臃肿。。http更灵活。
rpc:需要双方都使用同一语言,同一框架的rpc协议,调用很快,处理速度也很快。rpc实现难度较大。rpc比较定制化。(对效率要求更高,统一技术栈,建议用rpc)
但是,微服务强调自治,独立,灵活,rpc不太符合。。http restful更适合微服务。。
rpc实现:
RPC框架图:
Server: 服务提供方; Client: 服务消费方。Registry:服务注册与发现的注册中心。
服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表;
服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和Failover;
RCP框架流程:
1.Proxy代理层: 用于对象的代理;对象的反射调用;RPC流程的控制。
2.Serialize序列化层; 将请求序列化和结果反序列化。
3.Invoke网络模块; 主要用于网络通信的相关处理。
4.Container容器组件; 这层主要用于代理层监听网络请求。
RPC的优势在于,定义了一套框架,里面的技术可以自己选,比如序列化和反序列化,用高效的方式;比较灵活。。。
五、使用到的技术
1、动态代理: 生成 client stub和server stub需要用到 Java 动态代理技术 ,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架 如:CgLib、Javassist等。
2、序列化:为了能在网络上传输和接收 Java对象,我们需要对它进行 序列化和反序列化操作。
感觉最大优势在于protobuf(protocol buffers)
是一种语言无关、平台无关、可扩展的序列化结构数据的方法,用于数据通信协议、数据存储。
存储体积小3-10倍,传输效率快20-100倍。更简单。
数据序列化 面向通信 存储。。(效率 压缩)
(protobuf 优化原理:
1.针对int型,采用变长传输方式,(不局限于4个字节)
2.不传输属性名,用int型的tag
3.不传输多余的字符,比如json中大量花括号。
大部分场景下,比json效率高。
七层网络模型,
从底层到上层: 物理层-数据链路层-网络层(ip协议)-传输层-应用层(会话层,表示层,应用层)。。
网络层(主机之间):
IP协议非常简单,仅仅提供不可靠、无连接的传送服务
1> 网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能;
2> 基本数据单位为IP数据报;
3> 包含的主要协议:
IP协议(Internet Protocol,因特网互联协议);
ICMP协议(Internet Control Message Protocol,因特网控制报文协议);
ARP协议(Address Resolution Protocol,地址解析协议)可看成是跨网络层和链路层的协议;
RARP协议(Reverse Address Resolution Protocol,逆地址解析协议)。
重要设备:路由器。。
传输层(具体的端口,具体应用):TCP、UDP
为应用进程之间提供端到端的逻辑通信。
1> 传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;
2> 包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议);
3> 重要设备:网关。
网络层和传输层的区别:
网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而传输层则负责将数据可靠地传送到相应的端口。
应用层:FTP、SMTP、DNS、HTTP、Telnet(远程网络访问协议)
会话层:管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。
会话层、表示层和应用层重点:
1> 数据传输基本单位为报文;
2> 包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。
tcp, udp。。。ip。。
ip地址分类::
ip地址分网络号和主机号, ip地址由4段组成,每一段是一个字节(8位),最大值是255
网络号表示其属于互联网的哪一个网络,主机地址表示其属于该网络的哪一台主机。(主从关系)
ip共32位,4个字节,点分十进制记法。
A类地址:1个字节(8位,0+7位)表示网络号,网络号取值范围1~126,一般用于大型网络
后3个字节是主机号,(子网掩码255.0.0.0)
B类地址:2个字节(16位,10+14位)表示网络号
网络号取值为128~191,一般用于中等规模网络。子网掩码(255.255.0.0)
C类地址:3个字节(24位,110+21位)表示网络号,网络取值192~223,一般用于小型网络,子网掩码(255.255.255.0)
D类:以1110开始,用于组播(网络取值224~239,用于多路广播用户)
E特殊地址(用于科研),全1和全0保留不用。
子网掩码(subnet mask),又叫网络掩码、地址掩码、子网络遮罩,用来指明一个ip地址的哪些位标识的是主机所在的子网,哪些位标识的是主机的位掩码。
子网掩码必须结合ip地址一起使用。 作用是将某个ip地址划分为网络地址和主机地址2部分,屏蔽ip的一部分来区分网络标识和主机标识,并说明该ip在局域网还是在公网。
屏蔽ip的网络部分,A类默认子网掩码255.0.0.0
tcp udp区别
(位于传输层,只位于应用层之下,提供应用程序之间的通信,端口间, 1.格式化信息流;2.提供可靠传输,要可靠,必须接收端发回确认,丢失的话重新发送)
每个应用层协议 都有固定端口号, ip+端口号和一个可以固定到一个应用程序。(netstat -n查看端口号)
报文格式:报头header+数据
TCP格式:
报头 16位源端口号 + 16位目的端口号,
32位序号(标识TCP发送端向TCP接收端发送的数据字节流)
32位确认序号(SYN报文,ACK标志为0,没有确认序号)
首部长度, 标志位,
窗口大小(TCP流量控制,连接的每一端声明窗口大小,即接收缓冲区大小)
,校验和,(发送端计算存储,接收端验证)
面向字节流,将信息分割成组,接收端进行重组;(udp没有分组开销)
tcp 提供拥塞控制,和流量控制。
UDP格式:
分为首部字段 和 数据字段
首部字段:占用8个字节,源端口、目的端口、长度和校验和。
首部和数据一起计算校验,
1.udp协议是无连接的,传输数据前不需要建立连接,当然也没有不需要释放连接。
2.尽最大努力交付,udp无法保证数据能准确交付到目的主机,也不需要对接收到的udp报文进行确认。不安全, 没有确认机制、没有重传机制。
2.5 没有发送缓冲区,没有重传机制,所以不需要发送缓冲区(拿到直接发送)
3.面向报文,udp将应用层传下来的数据不进行拆分合并,原封不动的发送过去。
4.没有拥塞控制,udp协议发送速率不受网络的拥塞影响。
5.udp比较小,包里面包的字段少。
6.支持1对1、1对多、多对1、多对多的交互通信。
基于UDP的协议:(适用场景,对数据安全要求不高,数据多为短消息,不需要拥塞,网络负担重,响应速度要求高。基于数据报)
(视频流、voip,传输允许丢包,效率高;dns也用的udp,简单的文件传输tftp)
TCP被应用更广泛,因为安全。可靠。
面向连接,可靠的数据流传输
TCP传输的是TCP报文,注重数据安全性
TCP面向字节流, 只是点对点连接(udp方式多种),将信息分割成组,在接收端进行重组;
TCP用于网页 邮件等等。(http、ftp、telnet、
SYN:同步标志,同步序列编号栏,仅在三次握手时有效。
ACK:确认标志,确认编号栏,大多数情况是置位。
TCP三次握手(Three way handshake),建立TCP连接。建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
socket编程中。三次握手由客户端执行connect来触发,
(1)第一次握手,client将SYN置为1,随机产生值seq,将该数据包发送给server,client变为SYN-SENT状态,等待server确认。
(2)第二次握手:server收到数据包后,由标志位SYN=1知道client请求建立连接,server将标志位SYN和ACK都置为1,ACK=J+1,随机产生seq,并将该数据包发送给client以确认连接请求,server进入SYN-RCVD状态。
(3)第三次握手:client收到确认后,检查ACK是否是J+1,ACK是否为1,如果正确将标志位ACK置为1,ack=K+1,并将数据包发送给server,server检查ack=K+1,ACK是否为1,如果正确则建立连接成功,client和server都是established状态,完成三次握手,随后client和server之间就可以传输数据了。
TCP四次挥手:(用来终止连接)断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。该过程由客户端或服务端任一方执行close来触发。两个方向上都必须发送FIN
FIN 结束标志。
(1)第一次挥手:client发送一个FIN(请求释放连接),用来关闭client到server的数据传送,client进入FIN_WAIT_1状态(半关闭阶段,客户端停止向发送端发送数据,但是客户端还能接收服务端传输来的数据);seq=U
(2)第二次挥手:server收到FIN后,服务端结束established阶段,进入close-wait阶段(半关闭状态),发送一个ACK给client(表示接收到客户端发送的释放连接请求),ack=U+1, seq=V, 在客户端数据基础上加1作为确认。服务端释放连接。
(3) 第三次挥手:服务器再次向客户端发送数据,FIN,ACK,表示已经准备好释放连接了。seq=W,ack=U+1作为确认,服务端结束close-wait,进入last-ack阶段,停止服务端向客户端发送数据。
(4)客户端收到服务端的数据,进入TIME-WAIT阶段,向服务端发送一段报文。ACK:表示接收到服务器准备释放信号,seq=U+1,表示确认,Ack=W+1,客户端等待2MSL,(等待是确保服务端收到客户端的发送报文,MSL是一个传输生命周期)
然后。客户端和服务端进入close阶段。
关闭连接为啥比建立连接多一次。。
TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。
两者的区别大致如下:
TCP面向连接,UDP面向非连接即发送数据前不需要建立链接
TCP提供可靠的服务(数据传输),UDP无法保证
TCP面向字节流,UDP面向报文。。
TCP数据传输慢,UDP数据传输快。。
TCP提供一种面向连接的、可靠的字节流服务
在一个TCP连接中,仅有两方进行彼此通信,因此广播和多播不能用于TCP
TCP使用校验和,确认和重传机制来保证可靠传输
TCP使用累积确认
TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制。
TCP和UDP的应用场景
TCP:当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
在日常生活中,常见使用TCP协议的应用如:浏览器,用的HTTP;FlashFXP,用的FTP;Outlook,用的POP、SMTP;Putty,用的Telnet、SSH;QQ文件传输
UDP:当强调传输性能而不是传输的完整性时, 要求网络通讯速度能尽量的快。如:QQ语音 QQ视频等。
bTCP对应的协议和UDP对应的协议
TCP对应的协议:
FTP:定义了文件传输协议,使用21端口。
Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
HTTP:是从Web服务器传输超文本到本地浏览器的传送协议,端口默认80。
UDP对应的协议:
DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
TFTP(Trival File TransferProtocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
为什么 TCP 叫数据流模式? UDP 叫数据报模式?
所谓的“流模式”,是指TCP发送端发送几次数据和接收端接收几次数据是没有必然联系的,比如你通过 TCP连接给另一端发送数据,你只调用了一次 write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。
原因:这是因为TCP是面向连接的,一个 socket 中收到的数据都是由同一台主机发出,且有序地到达,所以每次读取多少数据都可以。
所谓的“数据报模式”,是指UDP发送端调用了几次 write,接收端必须用相同次数的 read 读完。UDP是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。
原因:这是因为UDP是无连接的,只要知道接收端的 IP 和端口,任何主机都可以向接收端发送数据。 这时候,如果一次能读取超过一个报文的数据, 则会乱套。
TCP中的流量控制和拥塞控制
注:tcp协议如何保证传输的可靠性
流量控制主要针对的是端到端传输中控制流量大小并保证传输可靠性(未收到ack就不滑动)。流量控制往往是指点对点通信量的控制,所要做的是抑制发送端发送数据的速率。
拥塞控制主要是一个全局性过程,涉及到所有主机,路由器,以及与降低网络传输性能有关的所有因素。防止过多的数据注入到网络中。如果有发生丢包则通过拥塞控制减小窗口,确定出合适(慢启动 拥塞避免 快重传 快恢复)的拥塞窗口(增性加乘性减)。
三次握手,四次挥手,是否可以携带数据。。
核心思想:让双方都证实对方能发收。知道对方能收是因为收到对方的因为收到信息之后发的回应(ACK)。
项目中的协议都在哪一层。。。
协议解析过程。。。
网络号,求子网掩码。。
子网划分。。