运输层
运输层的任务主要是负责主机中两个进程之间的通信。
运输层的功能主要有:
(1)复用与分用
(2)差错控制(完整性控制)
(3)可靠传输(按序交付,无丢失,不重复)
(4)拥塞控制(收发双方的协调一致)
流量控制(全局上的通信流量调节)
网络层与运输层的区别:
(1)运输层为应用进程之间提供端到端的逻辑通信。
(2)网络层为主机之间提供端到端的物理通信
(3)运输层对收到的报文进行差错检测,包括首部和数据部分。
(4)网络层IP数据报首部中的检验和字段,只检验首部是否出现差错而不检验数据部分。
(5)运输层有两种不同的运输协议,即面向链接的TCP(传输控制协议)和无连接的UDP(用户数据报协议)。
(6) 网络层无法同时实现这两种协议。
分用(Demultiplexing):即将运输层的报文段中的数据交付到正确的套接字的工作。
复用(Multiplexing):是在源主机的不同套接字中收集数据块,并为每个数据块封装上首部信息(将在分用的时候使用),从而生成报文段/数据报,然后将报文段/数据报传递到网络层工作。
端口:为了进行分用和复用,需要给应用层的每个进程赋予一个非常明确的标志,在协议层就采用了协议端口号,简称端口。
UDP和TCP都使用了与应用层接口处的端口与上层的应用进程进行通信。端口也就是运输层的服务访问点(TSAP),其作用就是让应用层的各种应用进程都能将其数据通过端口交付给运输层,以及让运输层知道将其报文中的数据向上通过端口交付给应用层相应的进程。
UDP协议:
UDP是一种无连接的, 即发送数据前不需要建立连接,因此减小的开销和发送数据的延迟。
UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
UDP是面向报文的,
UDP没有拥塞控制,因此网络出现的拥塞不会使主机的发送率降低。
UDP支持一对一,一对多,多对一和多对多的交互通信。
UDP首部开销小,只有8字节,比TCP的20个字节的首部要短。
TCP协议:
TCP提供了一种可靠的面向连接的字节流运输层服务。
TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认,对失序的数据重新排序,丢弃重复数据,TCP提供端到端的流量控制,并计算和验证一个强制性的端到端的检验和。
许多流行的应用程序如:Telnet,Rlogin, FTP,SMTP 都使用TCP。
TCP的一些主要特点:
TCP是面向连接的运输层协议
每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
TCP提供可靠交付的服务
TCP提供全双工通信
面向字节流的。
面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。这就是面试中经常会被问到的TCP三次握手。只是了解TCP三次握手的概念,对你获得一份工作是没有任何帮助的,你需要去了解TCP三次握手中的一些细节。
1. 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
2. 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
3. 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
完成了三次握手,客户端和服务器端就可以开始传送数据
当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,就要要断开TCP连接的了。那对于TCP的断开连接,这里就有了神秘的“四次分手”。
1.第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
2.第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
3.第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
4.第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
至此,TCP的四次分手就这么愉快的完成了。这就是著名的三次握手,四次分手。
那么为什么需要三次握手呢?
(1)为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
(2)“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”
(3)主要的原因是:为了防止服务器端的一直等待而浪费资源。
那么又是为什么要采用四次分手呢?
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。
FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。(主动方)
FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK信息),稍后再关闭连接。(主动方)
CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。(被动方)
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FINWAIT1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(主动方)
CLOSED: 表示连接中断。
这就是为什么会采用四次握手啦
一.HTTP协议
HTTP:HyperText Transfer Protocal,超文本传输协议。它是Web的核心。
HTTP协议由两部分程序实现:一个客户机程序和一个服务器程序,它们运行在不同的端系统中,通过交换HTTP报文进行会话。
HTTP定义了这些报文的格式,以及客户机和服务器是如何进行报文交换的,即:Web客户机是如何向Web服务器请求Web页面,以
及服务器如何将Web页面传送给客户机。
HTTP是一个无状态协议(stateless protocal)
(1)服务器向客户机发送被请求的文件时,并不存储任何关于该客户机的状态信息。
(2)假如某个特定的客户机在短短的几秒钟内两次请求同一个对象,服务器并不会因为刚刚为该用户提供了该对象就不再做出反应,
而是重新发送该对象,就像该服务器已经完全忘记不久之前所做过的事一样。
(3)正因为一个HTTP服务器并不保存关于客户机的任何信息,所以我们说HTTP是一个无状态协议。
非持久连接(non-persistent connection)和持久连接(persistentconnection)
(1)在许多因特网应用中,客户机和服务器进行长时间的通信,其中客户机发出一系列请求,服务器对每个请求进行响应。
(2)根据不同的应用程序以及应用程序使用的方式,这一系列请求,可以周期性地一个接一个地发出,也可以间断性地发出。
(3)当这种客户机/服务器的交互运行于TCP协议之上时,应用程序的研制者需要确定每个请求/响应对,是经一个 单独的TCP连
接 发送,还是所有的请求及相应的响应经 相同的TCP连接 发送。
(4) 如果每个请求/响应对,都是经一个 单独的TCP连接 发送,该应用程序被称为 使用 非持久连接;如果所有的请求及相应的响 应都经 相同的TCP连接 发送,则该应用程序被称为 使用 持久连接。
(5)HTTP既可以使用非持久连接,也可以使用持久连接,默认方式下,HTTP使用持久连接。
非持久连接的缺点:
(1)非持久连接必须为每一个请求的对象建立和维护一个全新的连接。
对于这样的连接,在客户机和服务器都要分配TCP的缓冲区和变量,这给服务器带来了严重的负担,因为一台Web服务器 可能同时服务于数以百计的客户机请求。
(2)每一个对象的传输时延为两个RTT(Round-TripTime,往返时间),即一个RTT用于建立TCP,另一个RTT用于请求和接 收一个对象。传输时延太大。
在持久连接的情况下,服务器在发送响应后保持该TCP连接打开。
在相同的客户机和服务器之间的后续请求和响应报文,可通过相同的连接进行传送。特别是一个完整的Web页面(如基本的
HTML文件,加上10个图形),可以用单个持久的TCP连接进行传送。
更有甚者,位于同一台服务器的多个Web页面,在从该服务器发送给同一个客户机时,可以在单个持久的TCP连接上进行。对
这些对象的请求可一个接一个地发出,而不必等待未决请求的回答,像流水线一样进行。
一般来说,如果一个连接经过一定时间间隔(一个可配置的超时间隔)仍未被使用,HTTP服务器就关闭该连接。
HTTP的默认模式使用了流水线方式的持久连接。
HTTP报文格式
HTTP报文有两种:请求报文和响应报文。
二.FTP协议
FTP:File Transfer Protocol,文件传输协议。
在典型的FTP会话中,用户坐在一台主机(本地主机)前面,向一台远程主机上传文件或从远程主机下载文件。 用户通过一个
FTP用户接口与FTP交互。用户首先提供远程主机的主机名,使本地主机的FTP客户机进程建立一个到远程主机FTP服务器进程的
TCP连接。
然后,为使用户能访问远程主机的账户,用户必须提供一个用户标识和口令,作为FTP命令的一部分在该TCP连接上传送。一
旦该服务器向该用户授权,用户就能从本地文件系统向远程文件系统传送文件,反之亦然。
三、HTTP与FTP的异同点
1. 同:
(1)都是应用层协议;
(2)都运行在TCP上,即都使用TCP(而不是UDP)作为其支撑的运输层协议。
2. 异:
(1)HTTP是超文本传输协议,是面向网页的;FTP是文件传输协议,是面向文件的。
(1)HTTP协议默认端口:80号端口。FTP协议默认端口:21号端口。
(3)FTP的控制信息是带外(out-of-band)传送的,而HTTP的控制信息是带内(in-band)传送的。
FTP使用两个并行的TCP连接来传输文件,一个是控制连接(control connection),一个是 数据连接(data connection)。
控制连接用于在两个主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及“put”和“get”文件的命令。
数据连接用于实际传输一个文件。
因为FTP协议使用一个分离的控制连接,因此称FTP的控制信息是带外传送的。
而HTTP协议是在传输文件的TCP连接中发送请求和响应首部行的,因此其控制信息是带内传送的。
(4)FTP服务器必须在整个会话期间保留用户的状态(state)信息,而HTTP是无状态的。
FTP服务器必须把特定的用户账户与控制连接联系起来,随着用户在远程目录树上移动,服务器必须追踪用户在远程目录树上
的当前位置。对每个活动着的用户会话的状态进行追踪,可以对FTP会话总数进行限制。
(5)FTP的控制连接是持久连接,数据连接是非持久连接;而HTTP既可以使用非持久连接,也可以使用持久连接,默认方式 下,HTTP使用持久连接。
(6)当用户主机与远程主机开始一个FTP会话前,FTP的客户机(用户)首先在21号端口上发起一个用于控制的与服务器(远 程主 机)的TCP连接。FTP的客户机通过该控制连接,发送用户的标识和口令,也发送改变远程目录的命令。
FTP的PORT(主动式)工作方式:当需要传送数据时,客户端在控制连接链路上用PORT命令告诉服务器:“我打开了XXXX端口,
你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据连接链路来传送数据。
FTP的PASV(被动式)工作方式:当需要传送数据时,服务器在控制连接链路上用PASV命令告诉客户端:“我打开了XXXX端口,
你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据连接链路来传送数据。
如果在同一个会话期间,用户还需要传输另一个文件,FTP则打开另一个数据连接。
因此,FTP的控制连接贯穿了整个用户会话期间,但是针对会话中的每一次文件传输,都需要建立一个新的数据连接。故,控
制连接是持久连接,而数据连接是非持久连接。
--------------------- 作者:枕着猫咪睡觉的王子 来源:CSDN 原文:https://blog.csdn.net/maybe_fly/article/details/78032462?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!