网络工作网站网络舆情监测专业
一、网络分层模型
当前存在三种划分网络模型的方式:
- OSI七层模型
- TCP/IP四层模型
- 五层模型
网络模型一般是指OSI七层参考模型和TCP/IP四层参考模型,前两个模型在网络中应用最为广泛;而五层模型是业界对OSI
和TCP/IP
的综合而产生的非官方协议模型,与四层协议主要区别是把网络接口分为了数据链路层和物理层。
1、OSI七层模型
OSI七层协议模型主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。
1. 应用层:application layer
应用层位于OSI参考模型的高层,通过FTP、Telnet、DNS、SMTP、HTTP、SSH等网络协议为用户提供所需要的各种服务。
2. 表示层 :peresentation layer
负责各种资源文件格式(文字、图像、声音、视频等)与网络数据格式(如文件流)间的相互转换。
3. 会话层 :session layer
负责管理通信连接,包括连接的建立、断开、连接保持多久等
4. 传输层:transport layer
为多个应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层还定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP)。
5. 网络层
不同于传输层的端到端的通信,网络层主要解决主机到主机的通信。它所包含的协议涉及数据包在整个网络上的逻辑传输。通过重新赋予主机一个IP地址来完成对主机的寻址,同时负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。
其中,IP协议是网络层最重要的协议,它提供了一个安全可靠、无连接的数据传递服务。
6. 数据链路层
在物理层提供的服务基础上,在通信的实体间建立数据链路连接,传输以“帧”为单位的数据包。
7. 物理层
计算机的物理连接方式,包括网线、网卡、电缆等,主要负责0、1信号的传送
2、TCP/IP四层模型
TCP/IP是一个四层的体系结构,主要包括:应用层、传输层、网络层和网络接口层。
网络接口层包括用于协作IP数据在已有网络介质上传输的协议。实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能。相反,它定义像地址解析协议(Address Resolution Protocol,ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口。
TCP/IP 分层模型的分层以以太网上传输 UDP 数据包如图所示;
3、五层模型
五层体系结构包括:应用层、传输层、网络层、数据链路层和物理层。
五层协议只是OSI和TCP/IP的综合,实际应用还是TCP/IP的四层结构。为了方便可以把下两层称为网络接口层。
二、TCP和UDP
TCP 和 UDP 是传输层的两个协议,区别如下:
1、TCP 是面向连接的,UDP 是面向无连接的
2、对系统资源的要求(TCP较多,UDP少);
3、UDP程序结构较简单;
4、TCP 是面向字节流的,UDP 是基于数据报的
5、TCP保证数据正确性,UDP可能丢包;
6、TCP保证数据顺序,UDP不保证。
1.TCP
TCP
全称为Transmission Control Protocol
(传输控制协议),是一种面向连接的
、可靠的
、基于字节流
的传输层通信协议。TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
1.1 TCP 的包头格式
TCP 的包头有哪些内容,分别有什么用
源端口和目标端口:用来找到对应的应用程序
包的序号:主要是为了解决乱序问题。不编好号怎么知道哪个先来,哪个后到
确认序号:发出去的包应该有确认,这样能知道对方是否收到,如果没收到就应该重新发送,这个解决的是不丢包的问题
状态位:(注意都是大写字母表示)
- SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
- ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。需要注意的是:不要将确认序号ack与标志位中的ACK搞混了。确认方ack=发起方seq+1,两端配对。
- FIN (finis): 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
- PSH:接收方应该尽快将这个报文交给应用层, 而不用等到整个缓存都填满了后再向上交付。
- RST:重置连接,当 RST = 1 时,表明 TCP 连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。
因为 TCP 是面向连接的,因此需要双方维护连接的状态,这些状态位的包会引起双方的状态变更
窗口大小:TCP 要做流量控制,需要通信双方各声明一个窗口,标识自己当前的处理能力。
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
1.2 TCP的三次握手
握手之前主动打开连接的客户端结束CLOSED阶段,被动打开的服务器端也主动监听某个端口, 结束CLOSED阶段,并进入LISTEN阶段。随后开始“三次握手”:
第一次握手:客户端向服务器端发送一段TCP报文,其中:
标记位为SYN=1,表示“请求建立新连接”;序号为seq=x(x为随机生成一个起始序列号ISN);随后客户端进入SYN-SENT阶段。
第二次握手:服务器收到syn包,必须确认客户端的syn包(ACK=1, ack=x+1)(即告诉服务器,我知道你收到我发的数据了),同时自己也发送一个SYN包(SYN=1, seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端接收到服务端的SYN+ACK包,明确了从客户端到服务器的数据传输是正常的,同时也要对服务端发来的syn包进行确认(ACK=1, ack=y+1), 序号为seq=x+1(第一次握手时发送报文序列号是x,所以这次seq就是x+1,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101)。
随后客户端进入ESTABLISHED阶段。服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。结束SYN-SENT阶段,进入ESTABLISHED阶段。
此后客户端和服务器端进行正常的数据传输。这就是“三次握手”的过程。
在客户端与服务器端传输的TCP报文中,双方的确认号ack和序号seq的值,都是在彼此ack和seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,
无法继续"握手",以此确保了"三次握手"的顺利完成。
为什么握手是三次,而不是两次或者四次?
答:Tcp通信需要确保双方都具有数据收发的能力,得到ACK响应则认为对方具有数据收发的能力,因此双方都要发送SYN确保对方具有通信的能力。第一次握手是客户端发送SYN,服务端接收,服务端得出客户端的发送能力和服务端的接收能力都正常;第二次握手是服务端发送SYN+ACK,客户端接收,客户端得出客户端发送接收能力正常,服务端发送接收能力也都正常,但是此时服务器并不能确认客户端的接收能力是否正常;第三次握手客户端发送ACK,服务器接收,服务端才能得出客户端发送接收能力正常,服务端自己发送接收能力也都正常。如果是两次握手,那么服务端就不能确认客户端是否可以正常接受数据;第二次握手过程中可以将SYN和ACK包一起发送,因此也没必要四次握手。
三次握手可以携带数据吗?
答:第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。
tcp三次握手失败,服务端会如何处理?
答:握手失败的原因有两种,第一种是服务端没有收到SYN,则什么都不做;第二种是服务端回复了SYN+ACK后,长时间没有收到ACK响应,则超时后就会发送RST重置连接报文,释放资源
ISN代表什么?意义何在?ISN是固定不变的吗?ISN为何要动态随机
答:ISN全称是Initial Sequence Number,是TCP发送方的字节数据编号的原点,告诉对方我要开始发送数据的初始化序列号。ISN如果是固定的,攻击者很容易猜出后序的确认号,为了安全起见,避免被第三方猜到从而发送伪造的RST报文,因此ISN是动态生成的
什么是半连接队列
答:服务器第一次收到客户端的SYN之后,就会处于SYN_RECD状态,此时双方还没有完全建立连接。服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列。当然还有一个全连接队列,就是已经完成三次握手,建立起来连接的就会放在全连接队列中,如果队列满了就有可能出现丢包现象
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
1.3 TCP的四次挥手
第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=u(等