计算机网络

OSI参考模型

由下而上:

物理层:通信道上的原始信号传输。数据传输介质:网线。传输形式:比特流。

数据链路层:完成网络之间相邻节点的可靠传输。主要设备:网卡、网桥、交换机。传输形式:帧。

网络层:完成网络主机间的报文传输,网络层识别的地址是IP地址。主要协议:IP协议。

传输层:整个网络传输的关键部分,实现两个用户之间端口对端口的数据通信。 主要协议:TCP/UDP协议。

会话层:在两个节点间建立、维护和释放用户的连接,并对会话进行管理和控制,保证会话数据的可靠传输。

例如:你通过秘书与对方建立联系,则你发出建立联系的请求相当于一个会话,秘书相当于传输层,然后秘书进行拨号联系对方,当对方接通对话,则会话的连接建立。

表示层:对数据进行相关处理转换,压缩与解压缩,加密与解密等。

应用层:应用层程序。主要协议:HTTP协议,HTTPS,FTP等。

总结:

OSI模型上层(会话层,表示层,应用层)处理用户接口、数据格式、应用访问。

OSI模型下层(物理层,数据链路层,网络层,传输层)处理数据在网络介质

 

 

 

TCP/UDP/IP协议

IP协议

IP协议位于网络层,把异构的物理网络连接起来。具有不可靠性,无连接性。

地址解析协议 ARP协议 实现由IP地址到MAC地址  MAC地址是机器的物理地址,固定不变。

网际控制报文协议 ICMP协议 当传送数据包发生错误时,ICMP协议会将错误信息封包传送回主机。

ping 用来测试两台主机的连通性,原理就是向目的主机发送 ICMP Echo请求报文,目的主机收到报文后会返回给主机。

TCP/UDP 协议

TCP协议是面向字节流传输的,每个TCP套接口都有一个缓冲区。每个TCP套接口有一个发送缓冲区,如果字节流太长时,TCP会将其拆分进行发送。当字节流太短时,TCP会等待缓冲区中的字节流达到一定程度时再构成报文发送出去,TCP发给对方的数据,对方在收到数据时必须给矛确认,只有在收到对方的确认时,本方TCP才会把TCP发送缓冲区中的数据删除。 

udp协议是面向数据报的协议。应用层交给UDP多长的报文,UDP就照样发送,一次发送一个报文。对应用层的报文既不合并也不拆分。

 

 

TCP的“三次握手”与“四次挥手”

三次握手

TCP报文中:

 序列号seq:占4个字节,用来标记数据段的顺序。

 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号。

 确认位ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。

 同步位SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一 个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

 第一次握手:建立连接时,客户端主动connect服务器,发送syn包(seq=x)到服务器,并等待服务器确认。此时TCP包中同步位SYN=1。

 第二次握手:服务器收到syn包后,会发送一个此包的回复ack给客户端(ack = x+1),同时自己也发送一个syn(seq=y)包。此时TCP包中将确认位ACK=1。

 第三次握手:客户端收到服务器的 syn+ack包后,确认ack是否正确,然后回复一个ack(ack=y+1)给服务端。此时客户端进入ESTABLISHED状态,服务端接收到此信号后进入ESTABLISHED状态。

 

补充阅读:

第一次握手时包丢失,没有到达服务端。客户端会周期性的超时重传,直至收到服务端ack包。

第二次握手时包丢失,没有到达客户端。服务端会周期性的超时重传,直至收到客户端ack包。

 

第三次握手时包丢失,没有到达服务端。此时客户端已经进入ESTABLISHED,而服务器没有收到ack依旧是active状态。

假定此时双方都没有数据发送,则服务端会像第二次握手一样超时重传syn+ack包给客户端,直到收到客户端的回复。

假定此时客户端向服务端发送数据,客户端会像服务端发送DATA+ack,还是可以建立连接,接收DATA。

假定此时服务端向客户端发送数据,不能发送,只能超时重传syn+ack包。

 

SYN Flood攻击

一种典型的DDOS攻击。如果客户端在发送了SYN报文后出现了故障,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的,即第三次握手无法完成,这种情况下服务器端一般会重试,向客户端再次发送SYN+ACK,并等待一段时间。如果一定时间内,还是得不到客户端的回应,则放弃这个未完成的连接。这也是TCP的重传机制。 

SYN Flood攻击正是利用在这一机制,客户端向服务器发送大量的ACK请求,当服务端回应SYN+ACK报文时,客户端不做任何回应。导致服务端建立大量的半连接,导致正常的请求无法回应。

防火墙针对这一攻击,一般会采用TCP代理与源探测两种方式进行解决。

TCP代理:防火墙代替服务端对客户端进行回复,当三次握手后确立了连接后再转交给服务端。一般用于报文来回路径一致的场景。

源探测:防火墙第一次收到客户端的syn包之后,会发送一个错误的的ack+syn包给客户端,如果是真实的客户端,客户端会发送一个RST报文给服务端,让服务端发送正确的ack+syn包。如果是虚假源就没有此步骤,就会被过滤掉。

 

 为什么TCP连接要建立三次握手?

防止失效的连接请求被服务端接收从而产生错误。

如果三次握手改成两次,客户端还是和三次握手一样收到服务答复后才ESTABLISH。但是服务端会变成当发送完ack时就ESTABLISH。但是如果此时网络堵塞,客户端发送的请求一直没有到服务端,就会超时重发,但服务端与客户端建立连接通信完成释放连接后。若此时堵塞的连接请求到了服务端,此时服务端回复后就进入ESTABLISH状态,但此时服务端早就closed了,所以会导致资源浪费。

四次挥手

 

 TCP报文中: 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放连接。

由于TCP连接是双向的,每两次都都只能断开一端的连接。

第一次挥手:如果客户端认为数据发送完毕,则主动向服务端发送连接释放请求(seq=u)。此时FIN=1,客户端进入FIN-WAIT-1。

第二次挥手:服务端接收释放请求后,发送答复(ack=u+1)与请求(seq=v)到客户端。ACK = 1。客户端进入FIN-WAIT-2,服务端进入CLOSE-WAIT

此时客户端向服务端的连接就释放了,处于半关闭状态。客户端向服务端不会发送数据,但服务端向客户端发送数据还是可以接受。

第三次挥手:当服务端发送完数据后,向客户端发送释放连接请求。FIN=1,ACK=1,ack=u+1,seq=w。

第四次挥手:客户端确认断开请求。ACK=1,ack=w+1,seq=u+1。

 

为什么建立连接协议是三次握手,而关闭连接协议是四次挥手?

因为在建立连接请求中,服务端发送ack与seq放在一起发送。

而在关闭连接请求时,因为全双工,发送方和接收方都需要FIN报文和ACK报文。当客户端发送关闭连接请求后服务端可能还会有数据要发送。所以先回复ack,当等数据全发送完后再发送FIN=1关闭连接请求。

 

为什么客户端接收到服务端断开连接请求后TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

1.可靠的实现TCP全双工链接的终止。保证客户端最后发送的ack报文到达服务端。

2.防止关闭连接后一段时间在相同的端口建立新的连接时,该旧链接的重复分组的出现。保证每建立新一个TCP连接时,来自该链接的原先化身分组已经在网络中消失了。

2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

 

长连接与短连接

长连接是指一个TCP连接上可以连续发送多个数据包,在TCP连接期间,如果没有数据包发送,则需要发送心跳包一直维持连接。长连接多用于读写频繁,点对点的通讯,而且连接数不能太多的情况。

短连接是指通信双方有数据交互时就建立TCP连接,数据传输完成后就关闭此连接。像WEB网站的http服务一般会用短连接。

如果客户端与数据库之间有连接池,一般推荐使用短连接。

http/https协议

超文本传输协议,常基于TCP/IP协议传输数据,端口号为80。https 则是具有安全性的ssl加密传输协议,端口号为443。

 

get/post

get一般是数据查询而post是提交数据操作

get将数据直接暴露在url中,而post是放在请求头中

get是幂等的,而post不一定是幂等的。

Cookie/Session机制

Http请求是无状态的协议。也就是说第一次和服务器连接并且登陆成功后,第二次通过该页面请求该服务器依然不知道用户信息。Cookie/Session用来解决该问题的机制。

比如:

  • 登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。第一次登录后服务器会返回一些数据(Cookie)给页面,第二次请求服务器时会把该cookie值自动带给服务器。
  • session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。session将信息存储在服务器中。

如果不设置过期时间,则表示这个cookie的生命周期为浏览器会话周期,当关闭浏览器再打开浏览器时cookie就消失了。若设置了过期时间,则到达该时间时cookie才会消失。

当请求创建一个session时,首先会检查客户端的请求中是否有session-id。关闭浏览器只会关闭浏览器上的session-id,并不会影响服务器。因此设置session时通常会设置一个session失效时间。

 

一个URL的过程。

DNS域名解析。

TCP连接

HTTP请求

服务器处理HTTP请求并返回HTTP报文

浏览器渲染对应的页面

关闭连接。

posted @ 2020-03-09 13:40  xxcnotes  阅读(243)  评论(0)    收藏  举报