目录
①根据需要,明确要传输什么信息;②约定好协议,规定信息按什么格式组织。
eg:点外卖时,发送请求包括用户ID和位置信息。
用户ID:001;经度:35;纬度:87;
①自定义协议
程序员规定按照用户ID,经度,纬度顺序,中间逗号隔开的格式组织信息
请求:001,35,87
优点:格式灵活,随意更改;
缺点:可读性不高。
②xml(通过标签组织数据)
请求:
<request>
<useID>001</useID>
<position>35,87</position>
</request>
优点:可读性高;
缺点:标签写起来繁琐,传输时会占用许多网络宽带。
③json
{
useID:"001",
position:"35,87"
}
使用{}把键值对包裹起来。键值对之间用“,”分割,键与值之间用“:”分割,键是String类型,值可以是数字、字符串、json、数组等类型。
优点:可读性高;
缺点:传输时会占用许多网络宽带。
④protobuffer
使用二进制来传输数据。
优点:传输效率高,占用网络宽带最低;
缺点:可读性不高。
(1)16位源端口号:2个字节,发送方程序端口号;
(2)16位目的端口号:2个字节,接收方程序端口号。
(3)16位UDP长度:表示整个数据报的最大长度(报头+数据),为0-65535,即64kb。若发送的数据报长度超过64kb,则需在应用层手动分包,多次发送,在接收端手动拼接。
(4)16位UDP检验和:
①检验和:在数据传输中,由于磁场、电场等外部环境的影响,导致数据传输出错,检验和就是检查数据是否传输出错。本质上是一个字符串,体积比原始数据小,但是由原始数据生成的。原始数据相同,得到的检验和一定相同;检验和相同,原始数据大概率相同。
②基于检验和完成数据检验:
发送方整理好数据(data1),通过一定算法计算出检验和(checksum1);
发送方将data1和checksum1通过网络发送出去;
接收方收到数据(data2,可能和data1不一样)和检验和checksum1;
接收方根据data2通过一样算法计算出检验和checksum2;特别
对比checksum1和checksum2,若不同,则原始数据肯定不同;若相同,则原始数据大概率相同。
③计算检验和:
UDP使用的CRC算法(循环冗余算法),把当前要计算检验和的数据,每个字节都进行累加,把结果保存到两个字节的变量中,累加过程溢出也没影响。但这种算法也不是靠谱的。
md5算法:一系列公式,完成md5的计算。
特点:无论原始数据多长,计算得到的md5都是固定长度;原始数据中,只要一个字节不同,md5差异也会很大;不可逆,给一个原始数据可以计算出md5,但已知md5计算出原始数据难以实现。
(1)报头长度:最短20字节(没有选项),最长60字节
(2)报头+数据长度:可变,当长度不够用时,可使用保留位扩充。
①概念:发送端将数据报发送给接收端,接收端收到数据后会向发送端发送一个回应报文(acknowledge,ack)发送端接收到回应报文后就知道自己发送成功了。
②如何保证数据与回应报文对应上?如何解决数据后发先至的情况?
上述发送数据时,第一个载荷数据的第一个字节为1,就会在报文序号中填1(载荷数据第一个字节的序号),长度为1000字节,则最后一个是1000,但不会在序号中记录。确认序号是对应的应答报文的,是对应载荷数据的最后一个序号+1,意思是确认序号之前的数据都已成功收到。如果数据出现后发先至的情况,接收端可以根据数据包的序号字段在接收缓存区进行排序,确保数据包按照正确的顺序进行处理。
③怎样区分是业务数据还是应答报文?
若传输的报文是应答报文,则在标志位ack位为1,表示传输的报文是应答报文,若为0,则为普通业务数据报文。
①概念
确认应答是一个理想情况,但若传输过程中出现丢包情况,发送端未收到ack,此时就会出现超时重传。
②丢包
在传输数据时,若数据包太多,会在路由器/交换机上出现堵塞情况,此时路由器/交换机不会保存这些挤压的数据,而是直接放弃这些数据,就会出现“丢包”情况。
③不同丢包情况
要发送的数据丢了:
返回的应答报文丢了:
④重传
发送端无法区分哪种情况导致ack未送达,在规定等待时间内,只要没有收到ack,发送端都会重新发送数据。初始等待时间是可配置的,随着丢包情况变多,等待时间也会发生变化,等待时间会变长,但也不是无限变长,当达到一定程度,认为数据无法成功传输,就会放弃tcp连接,触发tcp重置连接操作。
当是ack丢包时,重传数据时,站在接收方角度,会不会收到两份一样的数据???
答案是不会的。接收端收到数据后会将数据放到接收缓存区,当数据第二次来时,接收端发现数据已在缓存区存在,就会放弃该数据,所以读数据时也只会读取到一次。
①建立连接(三次握手)
上述建立连接过程中,传输的数据是一个简短的,没有业务的数据包,只是为了唤起对方。由发送端(客户端)先发起连接,此时数据的报文syn位为1;接收端收到syn后,接收端向发送端发送一个简短的,没有业务的数据包,此时数据的报文syn、ack位为1(合并为1次,提高效率),发送端收到后向接收端发送回应报文。完成三次握手后,发送端和接收端之间就建立了连接,即他们之间保存了对方的信息。
LISTEN状态:服务器这边把socket创建好,并把端口号绑定好,进入LISTEN状态,此时允许客户端随时建立连接。
ESTABLISHED状态:连接建立完成,可以进行正常通信。
三次握手的意义:确认当前网络是否通畅;使发送端和接收端确认发送和接收能力是否正常;让通信双方,在握手过程中,对一些参数(序号等)作出协商。
②断开连接(四次挥手)
发送端(服务器或者客户端)调用close方法或结束进程,发送报文,此时数据的报文FIN位为1;接收端收到报文发送应答报文,此时数据的报文ACK位为1;且调用close方法或结束进程发送报文,此时数据的报文FIN位为1。发送端收到数据报文后,发送应答报文。此时4次挥手完成,连接断开。
为什么这里ACK和FIN不能合并,ACK可以和SYN合并???
因为ACK和SYN是内核触发的,同一个时机发送可以合并;而FIN是应用程序执行的,与ACK发生的时机不同,不能合并;TCP还有一种机制是延时应答,能够拖延ACK的发送,ACK滞后就有机会和FIN合并。
TIME_WAIT状态:哪一方先断开连接,哪一方就会进入TIME_WAIT状态。若最后一个ACK丢失,接收端超时重传FIN,但此时发送端已经没有了,接收端一直无法收到ACK,此状态就是让发送端等待一段时间,防止ACK丢失了超时重传时也无法收到ACK。假设网络上两个节点通信消耗的最大时间为MSL,则等待的时间就为2MSL。
①背景
发送端发送一个数据,发送端收到应答报文后再发送下一个数据。但这样一发一收的话效率低。可不可以一次多发几个数据,批量传输,提高效率。
②具体机制
窗口大小:无需等待确认应答,发送端一次发送数据的最大数量。窗口大小越大,传输效率越高。上图中的窗口大小就是4000.
当收到一个ACK包之后,滑动窗口就向后移动,继续发送下一个数据。但若是中途出现丢包情况怎么解决???
③ACK丢包
此时ACK丢包了,不用进行重传。比如上图确认序号为1001的ACK包丢了,但确认序号为2001的ACK包发送端已经收到,表明2001序号之前的数据接收端都已经收到,1001的ACK包也就没那么重要了。
④数据包丢包
此时比如1001-2000的数据包丢包了。A需要知道此数据包丢了,B反复告诉A我需要1001序号的数据,在重复几次后,A就知道了1001序号的数据包没有发送成功,就会重新发送。发送成功后,就开始现在已经收到数据的应答报文。
若传输的数据少也不频繁,就使用普通的确认应答和超时重传;若传输的数据多且频繁,就使用滑动窗口模式。
当滑动窗口也不是越大越好,若一次传输的数据太多,就会出现阻塞,接收端处理不过来,就容易出现丢包情况。
①概念
根据接收端接收数据的能力,对滑动窗口大小进行控制。滑动窗口大小不应该超过接收端接收数据的能力。
②接收端接收数据能力
接收端接收到数据之后,会把数据放到接收缓冲区,接收端这边的应用程序read后,接收缓存区就会把数据删除,此时接收缓存区剩余空间大小就大了。接收缓存区剩余空间越大,接收端接收数据能力就越大。
③具体机制
接收端每次收到数据之后,就会把接收缓冲区剩余空间大小通过ACK包传输给发送端,发送端收到ACK包后就会根据接收缓冲区剩余空间大小调整下一轮的窗口大小。但若接收缓存区已满,没有数据传输,也没有ACK包告诉发送端接收缓存区什么时候有剩余。此时,发送端就会给接收端不断发送窗口探测包,不携带具体的业务数据,只是为了触发ACK包,获取接收缓存区剩余空间。
①概念:流量控制考虑了接收方的接收能力,而拥塞控制是考虑了整个通信的路径,考虑了通信过程中中间结点的情况,任何一个结点处理能力达到上限都容易导致数据传输出现丢包情况。
②具体机制
滑动窗口以一个较小的大小传输数据,之后以指数增长窗口大小,当到达阈值之后,窗口大小以线性增长,当出现丢包情况后,降低阈值,滑动窗口开始新一轮的动态变化。?
注:流量控制和拥塞控制机制都在限制窗口大小,最终窗口大小是两种机制的最小值。
具体机制:平常情况下,A给B发送数据,B收到数据后就会立即返回ACK,但有时也会延时应答。B收到数据后,先不着急返回ACK,等一段时间后,可能B的接收缓存区剩余空间也会变多,此时返回ACK也会提高传输效率。
具体机制:捎带应答是在延时应答的基础下提高tcp的传输效率,在传输数据时,往往是一问一答的方式,A给B请求,B给A应答报文,B给A响应,在延时应答后,应答报文会滞后,此时响应正好计算完成,则B将应答报文和响应可以一同返回给A,从而提高传输效率。
①问题
在面向字节流传输时,当有多个应用层数据包被传输时,在接收端的缓冲区就容易出现粘包问题,无法区分从哪里到哪里是一个完整的数据包。
②解决办法
明确应用数据包之间的边界
引入分隔符;引入长度
①进程崩溃tcp
进程结束相当于调用了socket.close()方法,触发四次挥手,tcp断开连接。进程结束时,tcp的连接还未断开。
②正常关机
强制结束进程,如果在系统关闭之前完成了四次挥手,则会正常断开连接;如果在系统关闭之后,B的ACK和FIN才到达,此时B收不到ACK,就会超时重传,重传几次后也没有响应,就会放弃tcp连接,触发tcp重置连接操作,发现没有什么效果,也就释放连接了。
③主机断电(非正常)
系统关闭是一瞬间的事,来不及进行四次挥手,此时对端迟迟未收到数据。
若对端是接收端,tcp有一个心跳包机制,接收端会周期性向发送端发送一个没有业务的数据包,期望得到发送端的一个应答,若重复几次没有响应,则认为发送端挂了,接收端单方面释放连接。
若对端是发送端,发送端未收到应答,就会超时重传,重传几次后也没有响应,就会放弃tcp连接,触发tcp重置连接操作,发现没有什么效果,也就释放连接了。
④网线端口
是一瞬间的事,来不及进行四次挥手,此时对端迟迟未收到数据。
若对端是接收端,tcp有一个心跳包机制,接收端会周期性向发送端发送一个没有业务的数据包,期望得到发送端的一个应答,若重复几次没有响应,则认为发送端挂了,接收端单方面释放连接。
若对端是发送端,发送端未收到应答,就会超时重传,重传几次后也没有响应,就会放弃tcp连接,触发tcp重置连接操作,发现没有什么效果,也就释放连接了。
注:若需要将数据发给局域网中的所有设备(广播),使用UDP
(1)地址管理;通过IP地址描述出一个设备在网络上的地址。
(2)路由选择;规划出合适的路径进行数据传输。
(1)4位版本:若为4,代表IPV4版本;若为6,代表IPV6版本。
(2)8位服务类型:能够让IP协议切换形态。4种形态彼此之间是冲突的,最小延时、最小成本、最大吞吐量、最高可靠性。
(3)16位总长度:IP协议总长度为64kb,但是IP协议支持拆包组包。拆出的小包之间的16位标识是一样的,标志中是是否支持拆包和是否是最后一个包,13位片偏移是小包的相对位置,方便按顺序组包。
(4)8位生存时间:描述这个数据包,在网络上还能生成多久。TTL的单位是次,表明该数据包还能被路由器/交换机转发的次数。TTL会设置一个初始值(32,64,128....),每经过一次转发就会-1.若一个数据包,目的IP是不存在的,当TTL消耗完时,该数据包也就消失了。每个路由器都知道自己的相邻设备,所以到达目的IP消耗的TTL不会太大。
(5)8位协议:描述的传输层是TCP协议还是UDP协议。
(1)IP地址:是一个32位的整数,为了方便人们理解,写作点分十进制方式,可以用2^32-1个IP地址,但在当代社会,上网设备多,IP地址存在不够用的问题。
(2)解决IP地址不够用的问题
①动态分配IP
同一时间,需要上网的设备才会分配一个IP地址。
②NAT机制(网络地址转化)
内网IP(局域网IP):如果一个IP地址是以10.或者172.16.-172.31.或者192.168.开头,IP就是内网IP,在同一个局域网内,内网IP之间不能重复;在不同局域网类,内网IP直之间可以重复。
外网IP(广域网IP):内网IP剩下的为外网IP,外网IP是唯一的,不可以重复。
通常一个学校,小区等有一个外网IP,一个外网IP内有多台设备,即有多个内网IP。
当电脑访问网站服务器时,需要先把电脑的内网IP地址通过NAT设备转换为外网IP地址,此时才能访问广域网,响应完成返回时,再通过NAT设备中的映射关系,将电脑外网IP地址转换为之前的内网IP地址。
当不同的电脑访问服务器时,若他们的内网IP地址是一样的,NAT设备转换时,在映射方面会结合端口号,使得区分数据应传给哪个设备;若IP地址和端口号都一样,则在转换时会分配他们不同的端口号,使得区分数据应返回给哪个设备。
③IPV6
16个字节表示IP地址,大幅度提高了IP地址的个数。但由于IPV4与IPV6不兼容,导致IPV6的普及程度并不高。
IP地址会被划分成两部分,网络号(标识一个局域网)+主机号(标识一个局域网中的设备),同一个局域网下,主机号必须不同。
一个IP地址中,哪部分是网络号,哪部分是主机号是通过子网掩码确定的。
eg:IP地址为:192.168.100.176;子网掩码为:255.255.255.0
子网掩码转为二进制为:11111111 11111111 11111111 00000000(左侧为1,右侧为0,不会交替出现)
IP地址转为二进制为:11000000? 10101000? 01100100 10110000
两者取余:11000000 10101000 01100100 00000000
上述结果为网络号:192.168.100
(1)5类划分方式
若一个IP地址主机号全为0,表示是网络号;
若一个IP地址主机号二进制全为1,表示是广播地址,该局域网中的所有设备都能收到;
若一个IP地址是127.开头的表示是环回IP(loopback),能够排除网络不流畅的因素,测试;
每个路由器内部都有一个数据结构路由表,传输数据时,根据目的IP,查路由表,如果查到了,就按照路由表给的方向继续转发;若没有查到,就按照路由表的默认表项继续转发。
①目的地址和源地址:指网卡的物理地址(mac),固定的,每个设备是唯一的;
②载荷数据类型:帧协议类型字段有三种值,分别对应IP(数据报长度不能超过1500字节(MTU),所以IP协议有拆包组包功能)、ARP、RARP;
③CRC:校验码。
MAC地址用来识别数据链路层中相连的节点,描述路途上每个区间的起点和终点;
IP地址是整个路途的终点和起点。
在数据转发过程中,IP地址不会改变,MAC地址会根据转发情况改变。