1、IP地址和 MAC 地址的关系:
- 网络层(IP 等) :包括IP协议以及一些路由选择协议等等,这一层的指定了数据要传输到的IP地址,中间涉及到一些最优线路,路由选择算法等
- 数据链路层(ARP)负责把 IP 地址解析为 MAC 地址,即硬件地址,这样就找到了对应的唯一的机器
- 有了MAC地址为什么还要使用IP地址?
1、IP地址在网络中体现的是“我在哪里”,而mac地址则在通信中体现“我是谁”。 IP地址就像是门牌号,Mac地址就像身份证号。如果只知道身份证号就只能在全世界广播,然后听到有一个人说这是我的Mac地址!如果知道IP号说这个人住在中国北京某某小区某单元某栋,那么很快就能找到了。 - 地址解析协议ARP、逆地址解析协议RARP:
IP地址——>ARP——>物理地址——>RARP——>IP地址
2、各层的作用:
- 应用层:对数据进行包装和解析
- 运输层:这一层指定了将数据传送到指定的端口号(指定的进程),提供了进程之间的逻辑通信
- 网络层:定义了将数据传送到对应的IP地址;提供了计算机之间的逻辑通信
- 数据链路层:将IP地址解析为MAC地址(硬件地址),通过MAC地址找到对应的唯一的主机
- 物理层:提供二进制传输服务,也是真正传输数据的层
3、tcp三尺握手的目的:
-
三次握手的目的是连接服务器指定端口,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。
-
为什么不是两次:
存在这种情况:第一次连接请求报文在网络节点长时间滞留了,延误到本次连接释放后的某个时间才到达 Server。这时 Server 会再次给 Client 发送确认报文(第二次握手),但是 Client 进程程序并不会理睬确认报文,因为 Client 没有发送连接请求。现在假如没有第三次握手就会建立连接,那么这次滞后的连接请求报文就会导致 TCP 误建立连接,而 Client 却不知已经建立连接,并不会发送数据给 Server,这样 Server 就会一直处于等待状态,这样就白白浪费了 Server 的很多资源。但有了第三次握手就会避免这种问题的发生,虽然延迟的连接请求发送到了 Server,但 Client 不会处理 Server 的确认报文,也不会再次发送确认请求报文,这样 Server 就知道了 Client 并没有真正想建立连接。所以不能是两次握手。
4、socket套接字:
- 使用 socket 的步骤如下:
1、创建 ServerSocket 并监听客户连接;
2、使用 Socket 连接服务端;
3、通过 Socket.getInputStream()/getOutputStream() 获取输入输出流进行通信。
- 一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。
- 套接字Socket=(IP地址:端口号),标识了特定主机的特定进程
5、本地的进程间通信(IPC)有很多种方式:
- bundle、AIDL、messager、广播、contentprovider、共享内存、socket套接字
8、网络传输数据时,信道和网络的利用率过高会产生非常大的时延
9、在四次挥手断开连接时,为什么 Client 需要等待 2MSL?
- MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长的最长时间,超过这个时间报文将被丢弃。
- 如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
- 再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。
10、为什么连接时时三次,断开时是四次
- 这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
11、在浏览器中输入www.baidu.com 后执行的全部过程:
- 发生的主要操作:
1、客户端浏览器通过DNS解析到www.baidu.com的IP地址202.108.22.5,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到202.108.22.5,然后通过TCP进行封装数据包,输入到网络层。
2、在客户端的传输层,把HTTP会话请求分成报文段,添加源端口、目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3、客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,无非就是通过查找路由表决定通过那个路径到达服务器。
4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。
- 事件顺序:
(1) 浏览器获取输入的域名www.baidu.com
(2) 浏览器向DNS请求解析www.baidu.com的IP地址
(3) 域名系统DNS解析出百度服务器的IP地址 (详细介绍DNS)-通过网关出去
(4) 浏览器与该服务器建立TCP连接(默认端口号80)
(5) 浏览器发出HTTP请求,请求百度首页
(6) 服务器通过HTTP响应把首页文件发送给浏览器
(7) TCP连接释放
(8) 浏览器将首页文件进行解析,并将Web页显示给用户。
网友评论