协议分层
1.OSI七层协议
应用层————————针对特定应用的协议
表示层————————设备固有数据格式与网络标志数据格式之间的转换
会话层————————通信管理。负责建立和断开通信连接
传输层————————负责两个节点之间的可靠传输
网络层————————地址管理和路由选择
数据链路层——————互联设备之间传输和识别数据帧
物理层————————界定连接器和网线规格
2.TCP/IP五层(四层)协议
应用层————————Telnet,FTP和e-mail等
传输层————————TCP和UDP
网络层————————IP,ICMP和IGMP
链路层————————设备驱动程序及接口卡
3.应用层协议-----HTTP
HTTP的核心内容包括请求和响应
请求(request):
首行:方法+url+版本
Header:描述HTTP请求的一些属性
空行:表示Header的结束
body:一般POST有body,而get没有
响应(response):
首行:版本号+状态码+状态码解释
Header:请求的属性
空行:表示Header的结束
body:返回页面的HTML内容
4.传输层协议------UDP/TCP
(1)UDP
①UDP特点:无连接(知道对方的IP和端口号之间进行传输,不进行连接;不可靠(没有确认机制,没有重传机制,如果因为网络故障该段无法发送给对方,UDP协议也不会收到任何应用层返回错误信息);面向数据报(不能够灵活的控制读写数据的次数和数量
②UDP的缓冲区:UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传送给网络层协议进行接下来操作;UDP具有接收缓冲区,但是这个接收缓存区不能保证收到的UDP报的顺序和发送UDP报的顺序,如果缓存区满了,再到达的UDP数据就会被丢弃。
③基于UDP的应用层协议
NFS(网络文件系统),TFTP(简单文件传输协议),DHCP(动态主机配置协议)BOOTP(启动协议),DNS(域名解析协议)
(2)TCP
①TCP特点:有连接;可靠;面向字节流(传输基本单位是字节,可以改变传输数据的数据和大小
②确认应答机制:TCP将传输的每个字节都编了号(序列号),每个ACK都带有对应的确认序列号,当这个确定序列号返回时,提示发送者已经收到了哪些数据,同时也告诉发送者应该从哪里开始发送;确认应答机制因为有了序列号可以达到很高的
③超时重传机制:TCP为了保证传输的可靠性,会动态的计算超时重传的时间,当没有收到序列号的数据,要求发送方重传,如果再这个时间内没有收到数据,会再延长更长的重传时间,以此类推,达到一定次数如果还没有收到任何重传数据,TCP就会认为网络或主机出现了异常,强行关闭连接
③连接管理机制:
三次招手四次挥手:建立连接时,主机A先发送一个SYN给主机B,此时主机B接收到主机A的数据,得出主机A的发送性能正常,而主机B本身的接收性能正常;由主机B同时回应SYN+ACK,此时主机A了解到主机B收到了自己的数据,说明自己的发送性能和主机B的接收性能正常,并且自己的接收性能和主机B的发送性能正常,但是此时B不知道主机A是否收到了自己发的SYN和ACK,所以由主机A再次将ACK响应给主机B,告诉主机B,主机A接收到了响应。释放资源时也是相同的传输过程,由主机A发送一个FIN给主机B,主机B如果收到主机A的FIN,先给主机A返回一个ACK确认自己收到了主机A的FIN,然后再给主机A发送FIN,主机A收到后给主机B返回ACK。建立连接和释放资源的区别就在于:SYN可以与ACK进行合并,而FIN一般是不能合并ACK,因为SYN和ACK都是操作系统内核发出的,具有时效一致性,而FIN由应用程序返回,发送时间不同,但是如果时间间隔比较小时,触发TCP延时应答机制和捎带应答机制,可能会发生FIN合并ACK
服务器状态:
CLOSE_WAIT:断开连接时的中间状态,一般发生在收到FIN返回ACK和发生FIN之间
ESTABLISHED:进入一定稳定状态
TIME_WAIT:释放资源,断开连接时会主动进入TIME_WAIT状态,防止最后一个ACK发生丢包情况,会在最后一个ACK发出时,持续2MSL时长(MSL是TCP报文存在的最大生存时间),保证资源并不会立即销毁
LISTEN:等待客户连接
④滑动窗口机制:
TCP传输过程中如果等待一个数据传输完毕再传输下一个数据,虽然很大程度上防止丢包,但是却降低了效率。所以引入滑动窗体机制提高效率,当一个接一个传递时,等待的时间就浪费了,所以当我们一次发送多条数据时,等待时间就重叠起来了,同一个等待的数据个数就是滑动窗口大小,当第一个数据发送后收到ACK时,滑动窗体就向后移动,当然,多个数据同时等待ACK时,很有可能中间会发生丢数据包或丢ACK,为了更好实现滑动窗口机制,操作系统内核开辟了发送缓冲区,只有应答了的数据才能删除,当ACK丢失时,可以根据后续ACK应答确认,影响不大。而当数据包丢失时,ACK响应会一直停留在丢失包的前一个数据包的ACK响应,当连续收到同样ACK响应达到一定次数,发送方就明白丢数据了,就会重发丢失的数据包,这时之前发送过的数据并不会丢弃,而是ACK响应出现在新的数据包响应。如果出现连续丢包时,如果补充了第一个丢掉的包,ACK响应就会变成第二个丢包的前一个ACK响应,直到把所有包全部补完,补完后数据包正常发送。(这也被称为高速重发机制,或快重传)
⑤流量控制:
如果发送方数据发送的速度太快,也会引发数据丢包,所以需要控制数据传输速度,接收端可以将自己可以接收的缓冲区大小通过ACK响应返回给发送方,发送方接受到后就可以改变发送数据的速度
⑥拥塞控制:
如果刚开始就发送大量数据导致丢包,仍然会引发问题,所以先设置一个小的滑动窗口进行“探路”,如果没有丢包,就设置更大的窗口,直到发生丢包,再缩小窗口,在这里引进了慢启动阈值,在阈值之前,窗口呈指数增加,超过阈值则线性增长,发生超时重传时,慢启动阈值置为原来的一半,而滑动窗口也置回1
⑦延时应答:
如果收到数据立即返回ACK,返回的窗口比较小,如果延迟一段时间,等到其他资源释放的差不多再响应ACK,这时窗口大小就变大很多,效率也变高了。当然,并不是每次接收到数据,都要延时应答,一般是每隔N个包就延时应答一次,或者每隔一段时间就应答一次
⑧捎带应答:
当数据发送给接收方,接收方的操作系统往往会回应,这时ACK就能搭顺风车,但是ACK是由内核发出,而发送响应的时机由代码实现,所以,要使ACK与响应时机发生在相同时间,就要保证两者时机相同,也可以利用延时应答
⑨面向字节流:
TCP在传输数据时,引入发送缓冲区和接收缓冲区,当数据过大,TCP会将其拆分成多个数据包发送,而数据太小,则先在缓冲区中等待,直到缓冲区长度差不多再发送给接收方
⑩粘包问题:
正是因为TCP面向字节流,所以应用程序并不知道一连串字节数据是从哪部分开始,又是到哪部分结束,所以要解决粘包问题,就要分清边界。
总结
TCP机制
提高可靠性(校验和,序列号,确认应答,超时重传,连接管理,流量控制,拥塞控制)
提高效率(滑动窗口,快速重传,延迟应答,捎带应答)