网络分层
TCP的四层
- 应用层: 规定向用户提供应用服务时通信协议。 如DNS
- 传输层: 提供处于网路连接中两台计算机之间的数据传输所使用的协议。在传输层有两个性质不同的协议TCP和UDP
- 网络层: 规定了数据通过怎么样的传输路线到对方计算机传送给对方。如IP协议
- 链路层: 用来处理连接网络硬件的部分,包括操作系统、硬件设备的驱动、网卡等
OSI七层模型
SI七层模型 | 功能 | 对应的网络协议 | TCP/IP四层概念模型 |
---|---|---|---|
应用层 | 文件传输,文件管理,电子邮件的信息处理——apdu | HTTP、TFTP, FTP, NFS, WAIS、SMTP | 应用层 |
表示层 | 确保一个系统的应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据的解密和加密,最小单位——ppdu | Telnet, Rlogin, SNMP, Gopher | 应用层 |
会话层 | 负责在网络中的两节点建立,维持和终止通信,在一层协议中,可以解决节点连接的协调和管理问题。包括通信连接的建立,保持会话过程通信连接的畅通,两节点之间的对话,决定通信是否被终端一斤通信终端是决定从何处重新发送,最小单位——spdu | SMTP, DNS | 应用层 |
传输层 | 定义一些传输数据的协议和端口。传输协议同时进行流量控制,或是根据接收方接收数据的快慢程度,规定适当的发送速率,解决传输效率及能力的问题——tpdu | TCP, UDP | 传输层 |
网络层 | 控制子网的运行,如逻辑编址,分组传输,路由选择最小单位——分组(包)报文 | IP, ICMP, ARP, RARP, AKP, UUCP | 网络层 |
数据链路层 | 主要是对物理层传输的比特流包装,检测保证数据传输的可靠性,将物理层接收的数据进行MAC(媒体访问控制)地址的封装和解封装,也可以简单的理解为物理寻址。交换机就处在这一层,最小的传输单位——帧 | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP,STP。HDLC,SDLC,帧中继 | 数据链路层 |
物理层 | 定义物理设备的标准,主要对物理连接方式,电气特性,机械特性等制定统一标准,传输比特流,因此最小的传输单位——位(比特流) | IEEE 802.1A, IEEE 802.2到IEEE 802. | 数据链路层 |
一、TCP
简介
TCP是传输控制协议,基于TCP的应用层有HTTP、SMTP、FTP协议等
特点
- 面向连接、面向字节流、全双共通道、可靠。
- 面向连接:使用TCP传输数据前,必须先建立TCP连接,传输完成后在释放连接
- 全双共通道:建立TCP连接后,通信双方都能发送数据
- 可靠:通过TCP连接传送的数据:不丢失、无差错、不重复、按序到达
- 面向字节流:数据以流的形式进行传输
优缺点
- 优点:数据传输可靠
- 缺点:效率慢(因需建立连接、发送确认包等)
建立连接 3次握手
- 第一次握手:客户端向服务器发送一个连接请求的报文段。报文段信息包括:同步标志位(SYN)设为1、随机选择一个起始序号(seq)为x、不携带数据。客户端进入同步已发送状态(SYN_SEND),等待服务器的确认
- 第二次握手:服务器收到请求连接报文段后,若同意建立连接,则向客户端发回连接确认的报文段。报文段信息包括:同步标志位(SYN)设为1、确认标记位(ACK)为1、随机选择一个起始序号(seq)为y、确认号字段(ack)为x+1、不携带数据。服务器进入同步已接受状态(SYN_RCVD)
- 第三次握手:客户端收到确认报文字段后,向服务器再次发出连接确认报文段。报文段信息包括:确认标记位(ACK)为1、序号(seq)为x+1、确认号字段(ack)为y+1、可携带数据。客户端、服务段都进如已创建状态,可开始发送数据
注意:成功进行TCP的三次握手后,就建立一条TCP连接,可传送应用层数据。
因为TCP提供的全双工通信,故通信双发的应用进程在任何时候都能发送数据。三次握手期间,任何一次未收到对面的回复,则都会重发。
为什么TCP建立连接需要三次握手?
防止服务器端因接收了早已失效的连接请求报文,从而一只等待客户端请求,最终导致形成死锁、浪费资源
描述如下:
- 客户端发出的第一个连接请求报文段无丢失,而是在某个网络结点长时间滞留了,导致延误到连接释放后的某个时间才到达服务器。
- 导致延误到连接释放后的某个时间才到达服务器
- 这是一个早已失效的报文段,但是服务器不知道,服务器收到此失效的连接请求报文段后,就误以为是客户端再次发出的一个新的请求,于是向客户端发出了确认报文段,同意建立TCP连接
- 假设不采用“三次握手”,即服务器发出确认报文段后,TCP连接就建立了,但由于客户端并无发出建立连接的请求,因此不会向服务器发送数据,因对于客户端来说,该报文已失效了,但是服务器却以为新的TCP连接已建立,于是一直等待客户端发送数据,即死锁状态
- 建立连接= 采用“三次握手”,即关键是第三次握手。
- 在上面的情况,客户端不会向服务器的确认报文信息,再次发出确认。服务器由于收不到客户端的确认信息,即知道客户端并无要求建立TCP连接,故服务器不会一直等待客户端发送数据,即不会形成死锁状态
SYN洪泛滥:
服务器的TCP资源分配时刻=完成第二次握手时,而客户端的TCP资源分配时刻 = 完成第三次握手时,这使得服务器易于受到SYN洪泛攻击,即同时多个客户端发起连接请求,从而需进行多个请求的TCP连接资源分配。
断开需要四次挥手
在通信结束后,双方都可以释放连接,共需四次握手。
释放TCP连接前。TCP客户端、服务器都处于已创建状态(ESTABLISHED),直到客户端主动关闭TCP连接
- 第一次挥手:客户端向服务器发起一个连接释放的报文段(停止在发送数据)。报文段信息:终止控制(FIN)设为1、报文段序号,设为前面传送数据最后一个字节的序号加1(seq = u),可携带数据(FIN = 1的报文几时不携带数据也消耗一个序号)。客户端进入终止等待1状态。(FIN-WAIT-1)
- 第二次握手:服务器收到连接释放报文段后,则向客户端发回连接释放确认的报文段。报文段信息:确认标记位设为1: ACK=1、报文段序号,设为前面传送数据最后一个字节的序号加1(seq = v),确认号字段设为:ack= u+1。服务器进入关闭等待状态(CLOSE-WAIT),客户端收到服务器的确认后,进入终止等待2状态(FIN-WAIT-2),等待服务器发出释放连接请求。至此,客户端->服务器的TCP连接已断开,即TCP连接处于半关闭的状态,即客户端->服务器断开,但服务器->客户端未断开
- 第三次握手:若服务器已无要向客户端发送数据,则发出释放连接的报文段。报文段信息:终止控制(FIN)设为1、确认标记位设为1:ACK=1,报文段序号,设为(seq = w),重复上次已发送的确认号字段设为:ack = u+1、可携带数据(FIN = 1的报文即使不携带数据也消耗一个序号)。服务器进入最后确认状态(LAST-ACK)
- 第四次握手:客户端收到连接释放报文段后,则向服务器发回连接释放确认的报文段。报文段信息:确认标记位设为1:ACK=1、报文段序号:seq = u + 1、确认号字段为:ack = w + 1、可携带数据(FIN = 1的报文几时不携带数据也消耗一个序号)。 客户端进入等待时间状 态(TIME-WAIT),服务器进入关闭状态(COLSE),此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL后,客户端才进入连接关闭状态(CLOSED),即服务器进入关闭状态比客户端要早一些。
为什么TCP释放连接需4次挥手?
- 为了保证通信双方都能通知对方。需释放和断开连接。
- 当主机1发出“释放连接请求”、主机2返回“确认释放连接”信息时,只表示主机1已无数据要发送到主机2,但主机2还是可以发送数据给主机1,主机1还是可以接受主机2的数据,即单向断开
- 当主机2也发送了“释放连接请求”、主机1返回“确认释放连接”信息时,表示主机2已无数据要发送到主机1,此时双发都无法通信,即TCP连接才算真正释放(双向)
为什么客户端关闭连接前要等待2MSL时间?
即TIME-WAIT状态的作用是什么?MSL = 最长报文寿命(Maximum Segment Lifttime)
原因1:为了保证客户端发送的最后一个请求连接释放确认报文能到达服务器,从而使得服务器能正常释放连接。解析:如下:
- 客户端发送的最后一个连接释放确认报文可能会丢失,当服务器收不到最后一个连接释放确认报文时,则不会进入关闭状态,但会超时重发,连接释放报文。
- 假设:客户端不等待2MSL时间就直接进行关闭状态(CLOSED),当最后一个连接释放确认报文丢失、服务器重发连接释放报文时,客户端则无法接收到服务器重新发送的连接释放报文时,客户端则无法接收到服务器重新发送的连接释放报文,因此也不会发送连接释放确认报文段,最终导致服务无法进入关闭状态(CLOSED)。
- 客户端发送最后一个连接释放确认后哦,先等待2MSL时间,在进入关闭状态(CLOSE),此时客户端则接收到服务器重新发送的连接释放报文,从而发送连接释放确认报文段,会重新启动2MSL计时器,使得服务器能正常进入关闭状态(CLOSED)
原因2:防止上文提到的早已失效的连接请求报文出现在本连接中,客户端发送了最后一个连接释放请求确认报文后,再经过2MSL时间,则可使本连接持续时间内所产生的所有报文段都从网络中消失。即在下一个新的连接中就不会出现早已失效的连接请求报文。
TCP无差错传输?
相对于UDP,TCP的传输是可靠的、无差错的。
对于发送端:每收到一个确认帧,发送窗口就向前滑动一个帧的距离,当发送窗口内无可发送的帧时(即窗口内的帧全部是已发送但未收到确认的帧),发送方就会停止发送,直到收到接收方发送的确认帧使窗口移动,窗口内有可以发送的帧,之后才可以继续发送。
对于接收端:当收到数据帧后,将串口向前移动一个位置,并返回确认帧,若收到的数据落在窗口之后,则一律丢弃。
发送窗口:定义:任意时刻,发送方维持的一组连续的、允许发送帧的帧序号。作用:对发送方进行流量控制。
接收串口:定义:任意时刻,接收方维持的一组连续的、允许接收帧的帧序号。作用:控制可接收哪些数据,不可接收哪些数据帧;接收方只有当收到的数据的序号落入接收窗口内才允许将该数据帧手下;否则,一律丢弃。
TCP和UDP的区别
TCP:面向连接、可靠、字节流(传输形式)、传输速率慢、所需资源多、要求通信数据可靠,首部字节在20-60
UPD:无连接、不可靠、数据报文段(传输形式)、传输速率快、所需资源少、要求通信速度快,首部字8个字节(由4个字段组成)
二、UDP
面向无连接
UDP是不需要和 TCP 一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。
具体来说:
- 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了
- 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作
不可靠性
- 不可靠性体现在无连接上,通信都不需要建立连接,想发就发。
- 收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。
- 网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。
高效
UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少得多,在传输数据报文时是很高效的。
UDP 头部包含了以下几个数据
- 两个十六位的端口号,分别为源端口(可选字段)和目标端口
- 整个数据报文的长度
- 整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误
传输方式
UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
三、HTTP
1.简介和特点
http:超文本传输协议,完成从客户端到服务器等一些系列运作流程。web是建立在http协议上的通信。
特点:
- http是不保存状态的协议,既无状态协议。协议本身对于请求或响应之间的通信状态不进行保存,因此连接双方不能知晓对方当前的身份和状态。这也是Cookie技术产生的重要原因之一:客户端的状态管理。浏览器会根据从服务器端发送的响应报文内 Set-Cookie 首部字段信息自动保持 Cookie。而每次客户端发送 HTTP 请求,都会在请求报文中携带 Cookie,作为服务端识别客户端身份状态的标识。
- 无连接,即交换http报文前,不需要建立HTTP连接http协议是TCP/IP协议的一个子集.http采用TCP作为运输层协议。
2.http请求报文。
http的请求报文有请求行、请求头、请求体组成
请求行: 声明请求方法、主机域名、路径资源、协议版本
请求头:声明客户端、服务器、等报文的部分信息
请求体:存放需发送的数据信息
报文结构如下: