一.网络传输中为什么需要协议
在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑
在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的
口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太
大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法
的用电线把电脑连接到了一起。
但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不
能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP/IP就是为此而生。
TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP
协议,以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外
语一样,就可以和其他的计算机终端做自由的交流了。
摘自:https://www.cnblogs.com/fengzanfeng/articles/1339347.html
下图为上图的补充:
扩展知识点之面向连接的协议和面向非连接的协议:
面向连接的协议是指通信双方在通信时,要事先建立一条通信线路,其有三个过
程:建立连接、使用连接和释放连接,如TCP协议;面向非连接是指在正式通信
前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信
非常相似:你在发短信的时候,只需要输入对方手机号就OK了,比如UDP协议,
QQ就是使用UDP协议。
二.HTTP协议
1.HTTP协议由两部分程序实现:一个客户机程序和一个服务器程序,它们运行在不同
的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的格式,以及客
户机和服务器是如何进行报文交换的,即:Web客户机是如何向Web服务器请求Web
页面,以及服务器如何将Web页面传送给客户机。
2.Http协议是建立在TCP协议基础之上的。
当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP
建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP
连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。
所谓的无状态,就是没有记忆能力,是指浏览器每次向服务器发起请求的时候,不是
通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中
就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关
闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。假如某个特定的
客户机在短短的几秒钟内两次请求同一个对象,服务器并不会因为刚刚为该用户提供
了该对象就不再做出反应,而是重新发送该对象,就像该服务器已经完全忘记不久之
前所做过的事一样。所以在Java Web编程中引入了Session,用来保持特定客户端状
态。
HTTP同时又是无连接的,无连接的含义是限制每次连接只处理一个请求。服务器处
理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时
间。早期这么做的原因是 HTTP 协议产生于互联网,因此服务器需要处理同时面向全
世界数十万、上百万客户端的网页访问,但每个客户端(即浏览器)与服务器之间交
换数据的间歇性较大(即传输具有突发性、瞬时性),并且网页浏览的联想性、发散
性导致两次传送的数据关联性很低,大部分通道实际上会很空闲、无端占用资源。因
此 HTTP 的设计者。随着时间的推移,网页变得越来越复杂,里面可能嵌入了很多图
片,这时候每次访问图片都需要建立一次 TCP 连接就显得很低效。后来,HTTP的持
久连接被提出用来解决这效率低的问题,关于持久连接请看本节4。
3.HTTP连接同样需要经历三次握手和四次分手
因为HTTP协议是建立在TCP协议之上的,所以同时需要考虑三次握手和四次分手。
4.HTTP可以是持久连接也可以是非持久连接,HTTP 1.1起默认是持久连接。
如果每个请求/响应对,都是经一个 单独的TCP连接 发送,该应用程序被称为使用
非持久连接;如果所有的请求及相应的响应都经 相同的TCP连接 发送,则该应用
程序被称为使用持久连接。
HTTP 1.0中,通过Connection: Keep-alive标识是持久连接。
HTTP 1.1中,默认就开启持久连接,除非HTTP首部有Connection: Close
客户端根据这些标识去识别服务器是否支持持久连接。
为什么要使用持久连接:
随着时间的推移,html页面变得复杂了,里面可能嵌入了很多图片,这时候每
次访问图片都需要建立一次tcp连接就显得低效了。因此持久连接被提出用来解决效
率低的问题。从HTTP/1.1起,默认都开启了持久连接,保持连接特性,简单地说,
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关
闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
持久连接不会永久保持连接,它有一个保持时间,可以在不同的服务器软件
(如Apache)中设定这个时间。虽然这里使用TCP连接保持了一段时间,但是这个时
间是有限范围的,到了时间点依然是会关闭的,所以我们还把其看做是每次连接完成
后就会关闭。后来,通过Session, Cookie等相关技术,也能保持一些用户的状态。
但是还是每次都使用一个连接,依然是无状态连接。
5.HTTP报文
HTTP报文:它是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的
元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据
部分。这些报文都是在客户端、服务器和代理之间流动。
HTTP报文的流动方向:一次HTTP请求,HTTP报文会从“客户端”流到“代理”再流到
“服务器”,在服务器工作完成之后,报文又会从“服务器”流
到“代理”再流到“客户端”。
报文的语法:所有的HTTP报文都可以分为两类,请求报文和响应报文。请求和响
应报文的基本报文结构大致是相同的,只有起始行的语法有所不同。
请求报文:它会向Web服务器请求一个动作
请求报文的格式:
起始行: <method> <request-URL> <version>
头部: <headers>
主体: <entity-body>
响应报文:它会将请求的结果返回给客户端。
响应报文的格式:
起始行: <version> <status> <reason-phrase>
头部: <headers>
主体: <entity-body>
HTTP报文的参数说明:
* 方式(method):客户端希望服务器对资源执行的动作,是一个单独的词,比
如,GET、POST或HEAD
* 请求URL(request-URL):要直接与服务器进行对话,只要请求URL是资源的
绝对路径就可以了,服务器可以假定自己是URL的
主机/端口。
* 版本(version):报文所使用的HTTP版本。其格式:
HTTP/<主要版本号>.<次要版本号>
* 状态码(status-code):状态码是三位数字,描述了请求过程中所发生的情况。
每个状态码的第一位数字都用于描述状态的一般类别
(比如,“成功”、“出错”等等)。
* 原因短语(reason-phrase):数字状态码的可读版本,包含行终止序列之前的
所有文本。原因短语只对人类有意义,因此,尽
管响应行HTTP/1.0 200 NOT OK和
HTTP/1.0 200 OK中原因短语的含义不同,但同
样都会被当作成功指示处理。
* 头部(header):可以有零个或多个头部,每个首部都包含一个名字,后面跟
着一个冒号(:),然后是一个可选的空格,接着是一个值,最
后是一个CRLF首部是由一个空行(CRLF)结束的,表示了头
部列表的结束和实体主体部分的开始。
关于HTTP协议的报文还有很多内容,这里就不一一列举了,请看:
https://www.cnblogs.com/zhuifeng/p/4072248.html
三.Tcp协议
1.TCP的三次握手和四次分手
(1)一些概念补充
Tcp(传输控制协议)层的一些flag字段,SYN、FIN、ACK、PSH、RST、URG。
它们的含义是:
SYN表示建立连接,当SYN=1同时ACK=0的时,表明这是一个连接请求的
报文段;SYN=1,ACK=1时,时一个响应的报文段。
FIN表示关闭连接。
ACK表示响应,ACK是确定收到的字段,用来解决丢包的问题当ACK=1的
时候“确认字号”(期望收到对方下一个报文段的第一个数据
字节的编号)才有效。
PSH表示有 DATA数据传输。
RST表示连接重置。
其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,
它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是
建立连接。TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是
不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。RST
一般是在FIN之后才会出现为1的情况,表示的是连接重置。一般地,当出现FIN
包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和
SYN+ACK包时,我们认为客户端与服务器建立了一个连接。PSH为1的情况,
一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP
数据包内容被传递。TCP的连接建立和连接关闭,都是通过请求-响应的模式完
成的。
(2)三次握手
为了理解三次握手,首先先了解为什么要三次握手:
信道是不可靠的,但是我们要建立可靠的连接发送可靠的数据,也就是数据
传输是需要可靠的。在这个时候三次握手是一个理论上的最小值,并不是说
是tcp协议要求的,而是为了满足在不可靠的信道上传输可靠的数据所要求
的。
如果不使用三次握手会怎么样呢?(这种解释不对)
第一次:首先A发送一个(SYN)到B,意思是A要和B建立连接进行通信。
如果是只有一次握手的话,这样肯定是不行的,A压根都不知
道B是不是收到了这个请求。
第二次:B收到A要建立连接的请求之后,发送一个确认(SYN+ACK)给
A,意思是收到A的消息了,B这里也是通的,表示可以建立连
接。
如果只有两次通信的话,这时候B不确定A是否收到了确认消
息,有可能这个确认消息由于某些原因丢了,这会导致B误认
为可以建立连接了,白白等待A端往过发消息。
第三次:A如果收到了B的确认消息之后,再发出一个确认(ACK)消息,
意思是告诉B,这边是通的,然后A和B就可以建立连接相互通
信了。
超时重试机制:
如果第一个包,A发送给B请求建立连接的报文(SYN)如果丢掉了,A会周期
性的超时重传,直到B发出确认(SYN+ACK);
如果第二个包,B发送给A的确认报文(SYN+ACK)如果丢掉了,B会周期性的
超时重传,直到A发出确认(ACK);
如果第三个包,A发送给B的确认报文(ACK)如果丢掉了,
三次握手的具体步骤:
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据
包到服务器,主机B由SYN=1知道,A要求建立联机。主机A进入
SYN_SEND状态等待服务器确认。
第二次握手:主机B收到请求后要确认联机信息,向A发送
ack number=(主机A的seq+1),syn=1,ack=1,随机产生
seq=7654321的包。主机B进入SYN_RECV状态。
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的
seq number+1,以及位码ack是否为1,若正确,主机A会再发送
ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值
与ack=1则连接建立成功。完成三次握手,主机A与主机B开始传
送数据。主机A和主机B进入ESTABLISHED状态。
(3)四次分手
首先了解一下TCP为什么要四次分手:
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是
全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没
有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这
个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表
示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;
当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,
就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连
接。
四次分手过程:
第一次分手:主机1,向主机2发送一个FIN报文段;此时,主机1进入
FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了。
第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,
主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关
闭请求;
第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入
LAST_ACK状态;
第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然
后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,
就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明
Server端已正常关闭,那好,主机1也可以关闭连接了。
2.HTTP和TCP
HTTP是一种短连接,每次请求建立连接,请求结束后断开连接;TCP是一种长连接。
四.socket
1.socket介绍
socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,
socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户
来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。Socket是处
于传输层的,主要有UDP和TCP两个协议。
2.socket和HTTP相比较
(a)Socket传输的特点:
优点:
* 传输数据为字节级,传输数据可自定义,数据量小(对于手机应用讲:费用低)
* 传输数据时间短,性能高
* 适合于客户端和服务器端之间信息实时交互
* 可以加密,数据安全性强
缺点:
* 需对传输的数据进行解析,转化成应用级的数据
* 对开发人员的开发水平要求高
* 相对于Http协议传输,增加了开发量
(b)HTTP传输的特点
优点:
* 基于应用级的接口使用方便
* 程序员开发水平要求不高,容错性强
缺点:
* 传输速度慢,数据包大(Http协议中包含辅助应用信息)
* 如实时交互,服务器性能压力大。
* 数据传输安全性差
(c)各数据传输方式的适用范围
Socket传输适用范围:
Socket 传输方式适合于对传输速度,安全性,实时交互,费用等要求高的应用中,
如网络游戏,手机应用,银行内部交互等
基于Http协议传输的适用范围:
基于http协议传输的特点:基于http协议传输方式适合于对传输速度,安全性要求不
是很高,且需要快速开发的应用。如公司OA系统,互联网服务等。
(d)socke和http的区别
HTTP为短连接、socket为长连接,socket可以实现很多协议,但是经常使用的是TCP
协议。
很多情况下,都是需要服务器端向客户端主动推送数据,保持客户端与服务端的实时
同步。若双方是 Socket 连接,可以由服务器直接向客户端发送数据;若双方是HTTP
连接,则服务器需要等客户端发送请求后,才能将数据回传给客户端。
五.FTP
文件传输协议,用于上传或下载文件。FTP使用两个并行的TCP连接来传输文件,一个是控
制连接(control connection),一个是数据连接(data connection)。 控制连接用于在两个
主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及“put”和“get”文件的命
令;数据连接用于实际传输一个文件,FTP的控制连接是持久连接,数据连接是非持久连接。
* FTP服务器必须在整个会话期间保留用户的状态(state)信息。
FTP服务器必须把特定的用户账户与控制连接联系起来,随着用户在远程目录树上移动,
服务器必须追踪用户在远程目录树上的当前位置。对每个活动着的用户会话的状态进行追
踪,可以对FTP会话总数进行限制。