我是结合android中遇到的网络知识串联一遍,可能会很杂,但是对复习网络基础知识很有帮助。
Socket:
socket是对TCP/IP协议的封装和应用(程序员层面上),socket是对ip和端口的封装,有着socket编程一说。而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。通过Socket,我们才能使用TCP/IP协议。实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,(之前一直对socket很模糊,现在比较清晰了)。
Android长连接,怎么处理心跳机制:
长连接就是大家建立连接之后, 不主动断开. 双方互相发送数据, 发完了也不主动断开连接, 之后有需要发送的数据就继续通过这个连接发送.TCP连接在默认的情况下就是所谓的长连接, 现在http1.1默认情况下也会是长连接,http1.0可以设置keep-live为true来达到长连接的效果。(http这儿我还没细看,有问题的欢迎来指正)
这里简单说一下推送,1 轮询,这样很简单,只要定时的去服务器那边查询有没有新的消息即可,但是这样每次都得来一次tcp 的三次握手和四次握手,很费电量和流量。2 SMS通知 服务器给客户端发送一条特殊的短信,然后让客户端拦截,然后进行通知。不过一般公司都不这么玩。 3 长连接 客户端主动和服务器建立TCP长连接之后, 客户端定期向服务器发送心跳包, 有消息的时候, 服务器直接通过这个已经建立好的TCP连接通知客户端.
心跳机制本来tcp是不需要心跳包的,因为tcp是有保活定时器的,默认是用保活定时器来维持长连接,但是保活定时器的周期是两小时。(还有一种说法是设置SO_KEEPALIVE才会开启保活定时器,但是我在课本上找到了这一段描述,客户端每次发一次报文,他就会重新设置保活计时器,从这就肯定了包活计时器是开着的,不用手动设置)。这些前提是NAT没有超时,DHCP正常续租。(DHCP(Dynamic Host Configuration Protocal)协议是干嘛的?在局域网中,每个电脑的ip配置很麻烦并且容易出错,就出现了DHCP。它可以使电脑插上网线就可以使用,首先他会广播发送DHCP发现报文,然后只有DHCP服务器(不止一个)会给他返回一个DHCP提供报文,电脑会从中选择一个,然后发送一个DHCP请求报文,服务器这时候发送确认报文DHCPACK,会给他分配一个动态的ip地址,这个ip是有租期的,到了时间电脑要主动续租,否则服务器会停用这个ip)。
但是为什么还要心跳包呢?因为不管是连无线还是使用移动网络,都有一个类似NAT表,将你的内部ip和外网ip对应着,如果你离开了这个wifi,ip就会消失,重连的话ip就会给你重新分配,而移动网络如果长时间没有数据,就会删除对应的NAT表。所以发送心跳包就是检测NAT有没有发生变化,其次才是检测连接有没有断开,(否则的话,客户端因为断网或者其他原因导致ip发上变化,链路断开, 没有写操作的TCP连接是感知不到的, 除非这个时候发送数据给服务器, 造成写超时, 否则TCP连接不会知道断开了. 主动kill掉一方的进程, 另一方会关闭TCP连接, 是系统代进程给服务器发的FIN. TCP连接就是这样, 只有明确的收到对方发来的关闭连接的消息(收到RST也会关闭, 大家都懂), 或者自己意识到发生了写超时, 否则它认为连接还存在.)
心跳包的间隔怎么设置,这个就有很大的文章了,
Ping的整个过程。ICMP报文是什么。
先介绍ICMP,首先icmp是网络层的,它是网际控制报文协议Intent Control Message Protocal,它的报文有两种,ICMP差错报告报文和ICMP询问报文,通过名字就知道两种报文的作用,ICMP会被装在ip报文中作为数据发送。
而平常说的ping就是ICMP的回送请求和回送回答报文,他们是询问报文中的一种,ping是Packet InterNet Groper分组网间探测,是应用层用网络层的一个典型例子,中间没有通过Tcp和UDP。一般ping某个主机,会一连发出四个回送请求报文,如果主机在线,他就会给源主机发回送回答报文。
过程:1 检查本地ARP缓存,查找目标主机的MAC地址 2 如果没有找到MAC地址,使用ARP协议获取目标主机MAC地址,并放入ARP缓存 3 发出ICMP echo request包,接收ICMP echo reply包
TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。
这一块可能都比较熟悉了,但是细节可能已经忘了,再复习一遍
三次握手:首先客户端A手动打开,发送一条连接请求报文段,当然A也会创建一个TCB传输控制模块,用来存储一些连接中的重要信息,报文段中有一个同步字段SYN=1,初始序列seq=x,这时A进入到SYN-SENT状态,服务器B收到请求后也会创建TCB,如果建立连接,则发送确认报文段SYN=1,ACK=1,seq=y,ack=x+1,同时B进入到SYN-RCVD,A收到后发送确认报文段,ACK=1,ack=y+1,seq=x+1,同时A进入ESTABLISHED状态,B收到后也进入到ESTABLISHED状态。
四次挥手:客户端A发送释放报文段,并停止发送数据,FIN=1,这是seq=u,进入FIN-WAIT-1状态,B收到请求,ack=u+1,这是seq=v,进入CLOSE-WAIT状态。这时TCP服务器通知高层应用进程,A到B的连接就释放了。TCP处于半关闭状态。A收到以后进入FIN-WAIT-2状态。如B也没数据可发,则FIN=1,seq=w(因为中间可能还发了一些数据),但是B还是重复上次的ack=u+1,这时B进入到LAST-ACK,等待的A的确认。A在收到B的释放连接后,ACK=1,seq=w+1,然后进入到TIME-WAITE状态。TIME-WAIT设为2MSL(Maximum Segment Lifetime),假如B收到后就进入CLOSE状态。假如2MSL时间到了后,A也进入到CLOSE状态,撤销相应的TCB,完成TCP的释放完成。
为什么要设置TIME-WAIT状态呢?1 可能B没收到确认,还会重发数据,这样A才能收到。2防止 可能本次连接以前发的“以失效的请求连接”出现在本次连接中,经过2MSL,就可以使本连接持续的时间内所产生的所有报文段从网络中消失。这样就可以在下一个新的连接中不会出现旧的连接请求。
Cookie与Session的作用于原理:
由于http是无状态的,所以必须得使用某种机制来保存用户的状态。Cookie和Session就能保存用户的状态。Cookie是用在客户端,一般都保存在硬盘上,当用户访问的时候,就会把保存的Cookie信息发送给服务器,服务器就会知道这是哪个用户发来的请求,服务器这边也会有相应的Session,记录着用户的信息。可以是内存、文件、数据库。刚开始用户没有生成Cookie的时候,服务器会在http上发送一条特殊的指令或者由脚本来让浏览器创建Cookie,里面有一个SessionId。等到下次用户再访问这个网站的时候,就可以使用Cookie,服务器就能识别。
上面说的有点乱:总结一次,Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP:
1 我们在浏览器中输入网址,但电脑并不认识如此复杂的字符串,因此电脑使用DNS服务解析出对应的IP地址 2 访问网页的过程基于Http协议,因此我们访问网页的过程实际上就是Http协议发送请求和响应请求的过程 3 Http协议是应用层协议,它基于传输层的TCP协议,TCP协议描述了进程与进程间如何通信交流,把具体的传输过程交给下层的网络层 4 网络层由IP协议控制数据包的路由选择和存储转发,但由于网络上的主机太多,IP协议管理不过来,因此又把网络主机分为多块,在外部使用EGP外部网关协议,在内部使用IGP内部网关协议(包括RIP协议与OSPF协议) 5 当网络层的数据传输到以太网后,就通过ARP协议获取目标主机的MAC地址,最后把数据传输的任务交给数据链路层处理。
几个特殊ip地址的含义:
一、IP 0.0.0.0
严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。对本机来说,它就是一个“收容所”,所有不认识的“三无”人员,一律送进去。如果你在网络设置中设置了缺省网关,那么Windows系统会自动产生一个目的地址为0.0.0.0的缺省路由。
二、IP 255.255.255.255含义
限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机。如果翻译成人类的语言,应该是这样:“这个房间里的所有人都注意了!”这个地址不能被路由器转发。
三、127.0.0.1
本机地址,主要用于测试。用汉语表示,就是“我自己”。在Windows系统中,这个地址有一个别名“Localhost”。寻址这样一个地址,是不能把它发到网络接口的。除非出错,否则在传输介质上永远不应该出现目的地址为“127.0.0.1”的数据包。整个127.* 网段通常被用作 loopback 网络接口的默认地址,不过一般默认为127.0.0.1。
四、224.0.0.1
组播地址,注意它和广播的区别。从224.0.0.0到239.255.255.255都是这样的地址。224.0.0.1特指所有主机,224.0.0.2特指所有路由器。这样的地址多用于一些特定的程序以及多媒体程序。如果你的主机开启了IRDP(Internet路由发现协议,使用组播功能)功能,那么你的主机路由表中应该有这样一条路由。
五、IP 169.254.x.x
如果你的主机使用了DHCP功能自动获得一个IP地址,那么当你的DHCP服务器发生故障,或响应时间太长而超出了一个系统规定的时间,Wingdows系统会为你分配这样一个地址。如果你发现你的主机IP地址是一个诸如此类的地址,很不幸,十有八九是你的网络不能正常运行了。
六、10.x.x.x、172.16.x.x~172.31.x.x、192.168.x.x
私有地址,这些地址被大量用于企业内部网络中。一些宽带路由器,也往往使用192.168.1.1作为缺省地址。私有网络由于不与外部互连,因而可能使用随意的IP地址。保留这样的地址供其使用是为了避免以后接入公网时引起地址混乱。使用私有地址的私有网络在接入Internet时,要使用地址翻译(NAT),将私有地址翻译成公用合法地址。在Internet上,这类地址是不能出现的。
Http1.0与Http1.1主要有以下区别:
1 是否允许复用连接:Http1.0不允许,响应请求后就断开连接,Http1.1允许且默认开启连接复用 2 Host头域:Http1.0没有,Http1.1有 3 状态码:Http1.1比Http1.0多了100,101,203,205等状态码 4 请求方式:Http1.0只有GET、HEAD和POST方法,Http1.1新增了其他多种方法
路由器和交换机的区别:
路由器工作于网络模型的网络层,其主要的功能是路由选择与存储转发,路由器上还能开启ACL访问控制列表、NAT地址转换等功能,扩展网络应用。
交换机工作于网络模型的数据链路层,其主要的功能是泛洪、存储转发、过滤和自学习,交换机还能够隔离冲突域,并划分VLAN。