1、浏览器输入网址后发生了什么
1)应用层:浏览器解析ULR,生成发送给web服务器的请求信息,HTTP请求报文生成,委托给操作系统将消息发送给web服务器,发送之前需要查询服务器域名对应的IP地址(需要知道发给谁);服务器保存了wbe服务器域名与IP的对应关系,就是DNS服务器(域名解析)
域名解析流程:(可以设置是否时转发模式)客户端发送DNS请求,询问www.sercer.com的IP,发给本地的DNS服务器->本地服务器缓存找到则返回->没有本地DNS去问他的根域服务器(根域服务器最高层次级别不直接用于域名解析)->根域分析.com然后告诉你.com定级域名服务器地址,本地DNS转到它继续查询->定级域名服务器给你告诉你权威www.servce.com区域DNS服务器地址->本地转请求到这里获得对应IP并告诉本地DNS,本地DNS将IP返回给客户端,客户端和目标建立连接。
DNS劫持:通过劫持了DNS服务器通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,结果就是对特定网址不能访问或者访问的是假网址,从而窃取资料破坏原有正常服务。
2)传输层:TCP 数据传输
HTTP是基于TCP协议传输的,TCP传输数据之前要先三次握手建立连接,应用层数据会在这里添加TCP头部
3)网络层IP:TCP在执行连接、收发、断开等各个阶段都需要委托IP模块将数据封装成网络包发给通信对象,在TCP报文基础上添加IP头部数据包。使用IP进行远程定位。
IP地址协议提供一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址依次屏蔽物理地址的差异
4)数据链路层/物理层:IP头部前添加MAC头部。包含了接收和发送方的MAC地址等信息,用于两点传输;获取发送方和接收MAC地址?发送方MAC地址是在网卡生产时写入到ROM里,读取写入MAC头部即可;接收方的MAC地址获取要用到ARP协议,ARP协议在以太网以广播的形式询问查找IP进而获取MAC地址(ARP缓存解决每次发送时进行ARP查询);
MAC地址指的是物理地址用来定义网络设备的位置,无论局域网还是广域网中的计算机之间的通信,变现上都是将数据包从某种形式的链路上的初始节点出发,从一个节点传递到另一个节点最终到目的节点,数据包在节点之间的移动都是由ARP地址解析协议负责将IP地址映射到MAC地址上来完成。
IP生成的网络包在内存里时一串二进制数字信息,不能直接发送给对方,需要数字信息转电信号才能在网线上传输,网卡负责次操作,控制网卡还需要网卡驱动程序。
数据包原样送达目的地:交换机,一种用于电(光)信号转发的网络设备; 路由器:连接两个或多个网络的硬件设备,在网络间起网关的作用,是读取每一个数据包中的地址然后决定如何传送的专用智能性的网络设备。
2、网关的作用
网关即网络中的关卡,互联网是一个一个的局域网、城域网、等连接起来的,在连接点上就是一个一个网络的关卡,即网关,他是保证网络互连的,翻译和转换,使得不同的网络体系能够进行。
同一网段的主机通信:网内通信,即通信双方都位处同一网段中,数据传输无需经过路由器(或三层交换机),即可由本网段自主完成。假设发送主机的ARP表中并无目的主机对应的表项,则发送主机会以目的主机IP地址为内容,广播ARP请求以期获知目的主机MAC地址,并通过交换机(除到达端口之外的所有端口发送,即洪泛(Flooding))向全网段主机转发,而只有目的主机接收到此ARP请求后会将自己的MAC地址和IP地址装入ARP应答后将其回复给发送主机,发送主机接收到此ARP应答后,从中提取目的主机的MAC地址,并在其ARP表中建立目的主机的对应表项(IP地址到MAC地址的映射),之后即可向目的主机发送数据,将待发送数据封装成帧,并通过二层设备(如交换机)转发至本网段内的目的主机,自此完成通信。
3、TCP协议简介
1、TCP协议
TCP(Transmission Control Protocol) 传输控制协议,提供可靠的端到端字节流传输协议;TCP头部如下
序列号:建立连接时由计算机生成的随机数为初始值,通过SYN包传给接收端主机,每发送一次数据就加一次数据字节数的大小,用来解决网络包乱序的问题
确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序列以前的数据已经被正常接收,用来解决不丢包问题。
TCP连接:用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。理论上的TCP最大连接数=客户端IP数X客户端的端口数;
与UDP对比
TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的
TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信。TCP面向的是字节流的服务,UDP面向的是报文的服务。
2、三次握手、四次握手
1)第一次握手:建立连接时,客户端向服务器发送SYN包(seq=x),请求建立连接,等待确认
2)第二次握手:服务端收到客户端的SYN包,回一个ACK包(ACK=x+1)确认收到,同时发送一个SYN包(seq=y)给客户端
3)第三次握手:客户端收到SYN+ACK包,再回一个ACK包(ACK=y+1)告诉服务端已经收到
三次握手完成,成功建立连接,开始传输数据
为什么需要三次握手?
用于保证可靠性和流量控制维护某些状态信息,这些信息包括socket、序列号和窗口大小,如做到?
三次握手才可以阻止重复历史连接的初始化造成混乱:在网络拥堵的情况下一个旧的SYN报文比新的SYN报文早到达服务端;服务端回一个SYN+ACK报文给客户端,客户端收到后根据自身的上下文判断这是一个历史连接(序列号过期或超时)客户端发送RST报文给服务端表示终止这一次连接。两次握手不能判断当前连接是否是历史连接,如果不是历史连接就发送ACK报文建立连接
三次握手另一个原因同步双发初始序列号:tcp通信双发都在维护一个序列号,序列号是可靠传输的一个关键因素,它的作用:接收方可以去除重复的数据;接收方可以根据数据包的序列号按序接收;可以标识发送出去的数据包中, 哪些是已经被对方收到的;
还有一个原因是避免资源浪费:只有两次握手时客户没有收到ACK报文就会重新发SYN,没有第三次握手服务器不清楚客户端是否收到自己建立连接的ACK信号,所以每收到一个SYN就建立一个连接这时多个重复的SYN报文服务器建立多个冗余的无效连接造成不必要的资源浪费。
四次握手断开连接:
1)客户端发送FIN包(FIN=1)给服务端,告诉它自己的数据已经发送完毕,请求终止连接,此时客户端不发送数据,但还能接收数据,客户端进入FIN_WAIT_1状态
2)服务端收到FIN包,回一个ACK包给客户端告诉它已经收到包了,此时还没有断开socket连接,而是等待剩下的数据传输完毕。服务端进入CLOSED_WAIT状态,客户端收到ACK后进入FIN_WAIT_2
3)服务端等待数据传输完毕后,向客户端发送FIN包,表明可以断开连接进入LAST_ACK状态
4)客户端收到后,回一个ACK包表明确认收到,等待一段时间,确保服务端不再有数据发过来,然后彻底断开连接。
3、TCP可靠性保证
TCP主要提供了检验和、序列号/确认应答、超时重传、最大消息长度、滑动窗口控制等方法实现了可靠性传输
检验和:通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送。TCP在计算检验和时,会在TCP首部加上一个12字节的伪首部。检验和总共计算3部分:TCP首部、TCP数据、TCP伪首部;
序列号/确认应答:这个机制类似于问答的形式,计算机的确认应答机制也是一样的,发送端发送信息给接收端,接收端会回应一个包,这个包就是应答包。上述过程中,只要发送端有一个包传输,接收端没有回应确认包(ACK包),都会重发。或者接收端的应答包,发送端没有收到也会重发数据。这就可以保证数据的完整性。
TCP超时重传:TCP可靠性中最重要的一个机制是处理数据超时和重传。TCP协议要求在发送端每发送一个报文段,就启动一个定时器并等待确认信息;接收端成功接收新数据后返回确认信息。若在定时器超时前数据未能被确认,TCP就认为报文段中的数据已丢失或损坏,需要对报文段中的数据重新组织和重传。
最大消息长度:在建立TCP连接的时候,双方约定一个最大的长度(MSS)作为发送的单位,重传的时候也是以这个单位来进行重传。理想的情况下是该长度的数据刚好不被网络层分块。
滑动窗口:滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。TCP的滑动窗口解决了端到端的流量控制问题,允许接受方对传输进行限制,直到它拥有足够的缓冲空间来容纳更多的数据;窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
拥塞控制:窗口控制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。为此TCP引入慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。
发送开始时定义拥塞窗口大小为1;每次收到一个ACK应答,拥塞窗口加1;而在每次发送数据时,发送窗口取拥塞窗口与接送段接收窗口最小者。
慢启动:在启动初期以指数增长方式增长;设置一个慢启动的阈值,当以指数增长达到阈值时就停止指数增长,按照线性增长方式增加至拥塞窗口;线性增长达到网络拥塞时立即把拥塞窗口置回1,进行新一轮的“慢启动”,同时新一轮的阈值变为原来的一半。