通过序列号和确认号应答(ACK)TCP实现可靠性传输
(TCP/IP中识别一个进行通信的应用需要5大元素,“源IP地址”、“目标IP地址”、“源端口”、“目标端口”、“协议号”,然而UDP的首部中只包含它们当中的两项“源端口和目标端口”,剩下的3项都包含在IP首部里,如果这3项被破坏了可能导致收包应用收不到包,或者不该收到的应用收到了,所以有必要验证通信中5项识别码是否正确,引入伪首部,`TCP/UDP通过伪首部,得以对5项数字进行验证,从而实现即使在IP首部并不可靠地情况下仍然能够提供可靠传输`)TCP和UDP区分TCP用于在传输层有必要实现可靠传输的的情况。由于它是面向有连接并具备顺序控制、重发控制等机制,所以它可以为应用提供可靠传输。
UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。
以上五个术语都是用来表述数据的单位,区分如下:
因为TCP连接是全双工的,也就是说通信的双方都可以向对方发送和接收消息,所以断开连接需要双方的确认。
Web中可以通过TSL/SSL对HTTP通信进行加密。使用TSL/SSL的HTTP通信叫做HTTPS通信。HTTPS中采用对称加密方式。而在发送其公共密钥时采用的则是公钥加密方式。确认公钥是否正确主要使用认证中心(CA)签发的证书,而主要的认证中心信息已经嵌入到浏览器出厂设置中。如果Web浏览器中尚未加入某个认证中心,那么会在页面上提示一个警告信息。此时,判断认证中心是否合法与否就要由用户自己决定。
SSL/TLS协议的基本思路是采用公钥加密法;SSL/TLS协议的基本过程是这样的:(1)客户端向服务器端索要并验证公钥。(2)双方协商生成”对话密钥”。客户端用公钥对对话秘钥进行加密。(3)服务器通过私钥解密出对话秘钥(3)双方采用”对话密钥”进行加密通信。上面过程的前两步,又称为”握手阶段”
注意:服务器有两个密钥,一个公钥、一个私钥,只有私钥才可以解密公钥加密的消息;
对称加密:加密效率高,速度快,适合大数据量加密。DES/AES
非对称加密:算法复杂,加密速度慢,安全性更高。结合对称加密使用。RSA、DHRSA算法的可靠性基础:对极大整数做因数分解是很困难的。
单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,即不能对输出进行计算从而得到输入信息。
这样保存在数据库中的是用户输入的密码的密文,而且是不可逆计算得到的密码的明文,因此即使数据库被“暴露”,也不会泄露用户的密码信息。另外,虽然不能通过算法将单向散列密文反算得到明文,但是由于人们设置密码具有一定的模式,因此通过彩虹表(人们常用的密码与对应的密文关系表,具体我还不了解。。。)等手段进行猜测式破解。(没有绝对的安全~~~)为了加强单向散列计算的安全性,还会给散列算法加点盐(salt),salt相当于加密的密钥,增加破解的难度。
常用的单向散列算法有MD5、SHA等。单向散列算法还有一个特点就是输入的任何微小变化都会导致输出的完全不同,这个特性有时也会被用来生成信息摘要、计算具有高离散程度的随机数等用途。
对称加密就是加密和解密使用的密钥是同一个密钥。对称加密通常用在信息需要安全交换或存储的场合,如cookie加密、通信加密等。
常用的对称加密算法有DES算法、RC算法等。对称加密是一种传统加密手段,也是最常用的加密手段,适用于绝大多数需要加密的场合。
不同与对称加密,非对称加密和解密使用的密钥不是同一密钥,其中一个对外界公开,被称作公钥。另一个只有所有者知道,被称作私钥。用公钥加密的信息必须用私钥才能解开,反之,用私钥加密的信息只有用公钥才能解开。非对称加密技术通常用在信息安全传输,数字签名等场合。
数字签名则相反,签名者用自己的私钥对信息进行加密,然后发送给对方,接收方用签名者的公钥对信息进行解密,获得原始明文信息,由于私钥只有签名者自己拥有,因此该信息是不可抵赖的,具有签名的性质。
在实际应用中,常常会混合使用对称加密和非对称加密。先使用非对称加密技术对对称密钥进行安全传输,然后使用对称加密技术进行信息加密解密与交换。而有时,对同一个数据两次使用非对称加密,可同时实现信息安全传输和数字签名的目的。
非对称加密的常用算法有RSA算法等。HTTPS传输中浏览器使用的数字证书实质上是经过权威机构认证的非对称加密的公钥。
HTTP协议
其完整的工作过程可分为四步:
①连接:首先客户机与服务器需要建立连接(由TCP/IP握手连接实现)。只要单击某个超级链接,HTTP的工作开始;
②请求:建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容;
③应答:服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上;
④关闭:当应答结束后,浏览器和服务器关闭连接,以保证其他浏览器可以与服务器进行连接。
更完整的过程可能如下:
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
Https协议
HTTPS握手过程包括五步:
1)浏览器请求连接;2)服务器返回证书:证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。服务器采用非对称加密算法(RSA)生成两个秘钥,私钥自己保留。3)浏览器收到证书后作以下工作:
a)验证证书的合法性;b)生成随机(对称)密码,取出证书中提供的公钥对随机密码加密;浏览器即客户端使用非对称加密来加密对称加密规则,对称加密用于加密后续传输的信息。
c)将之前生成的加密随机密码等信息发送给网站;4)服务器收到消息后作以下的操作:
a)使用自己的私钥解密浏览器用公钥加密后的消息,并验证HASH是否与浏览器发来的一致;获得浏览器发过来的对称秘钥。b)使用加密的随机对称密码加密一段消息,发送给浏览器;5)浏览器解密并计算握手消息的HASH:如果与服务端发来的HASH一致,此时握手过程结束,之后进行通信。
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。HTTP风险:1、窃听风险,采用明文传输2、篡改风险,第三方可以修改3、冒充风险,第三方冒充他人身份进行通信
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
是无状态协议
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输
HTTP1.0
1、默认短连接,每个TCP连接只能发送一个请求,而建立TCP成本很高。需要使用keep-alive参数来告知服务器要建立一个长连接,
2、HTTP1.0是没有host域的,HTTP1.1才支持这个参数;
HTTP1.1
1、在HTTP/1.1中已经默认使用Connection:keep-alive,避免了连接建立和释放的开销,但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。通过Content-Length字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。
2、支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401;
3、HTTP1.1引入管道机制,即在同一个TCP连接中,可以同时发送多个请求,服务器按顺序响应。
4、引入分块传输编码机制,在耗时操作上,产生一块数据,就发送一块数据。
HTTP2.0
1、使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级;
2、支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快;
3、服务器推送:服务器除了对最初请求的响应外,服务器还可以额外的向客户端推送资源,而无需客户端明确的请求。
GETGET用于信息获取。POSTPOST向服务器提交数据,可以改变服务器上的资源。HEADHEAD与GET本质是一样的,区别在于主要用于获取报文首部,不返回报文主体信息。PUTPUT与POST极为相似,都是向服务器发送数据,但PUT通常制定了资源存放的位置,而POST没有。DELETEDELETE用于删除某一资源。OPTIONSOPTIONS用于获取当前URL所支持的HTTP请求方法TRACETRACE用于追踪路径,远程诊断服务器,它会把服务器之前的请求通信返回给客户端。
(1)发送机制不同,GET一般用于查询/获取资源信息,而POST一般用于更新资源信息。
(2)GET请求的数据会附在URL之后,POST把提交的数据放置在HTTP请求体中
(3)GET方式提交的数据最多只能是1024字节(取决于操作系统的支持),POST理论上没有数据量的限制(取决于服务器的处理能力)。
(4)POST的安全性比GET的安全性高。通过GET提交数据,用户名和密码会以明文的形式出现在URL中
(5)GET请求会被浏览器自动缓存,而POST不会,除非手动设置。在浏览器回退时,GET是无害的,POST会再次提交请求。GET请求参数会被完整保留在浏览历史记录中,而POST中的参数不会被保留
(6)在发送请求时,GET产生一个TCP数据包,服务器响应200,POST产生两个TCP数据包,浏览器先发送header,响应100,再发送data,响应200.
(7)GET请求只能进行url编码,而POST支持多种编码方式。
①浏览器先检查自身缓存中有没有被解析过这个域名对应的ip地址;
②如果浏览器缓存没有命中,浏览器会检查操作系统缓存中有没有对应的已解析过的结果。在windows中可通过c盘里hosts文件来设置;
③还没命中,请求本地域名服务器来解析这个域名,一般都会在本地域名服务器找到;
④本地域名服务器没有命中,则去根域名服务器请求解析;
⑤根域名服务器返回给本地域名服务器一个所查询域的主域名服务器;
⑥本地域名服务器向主域名服务器发送请求;
⑦接受请求的主域名服务器查找并返回这个域名对应的域名服务器的地址;
⑧域名服务器根据映射关系找到ip地址,返回给本地域名服务器;
⑨本地域名服务器缓存这个结果;
⑩本地域名服务器将该结果返回给用户;
HTTP服务器一般会提供KeepaliveTimeout参数,用来决定连接保持多久,什么时候关闭连接。
当连接使用了Keepalive功能时,对于客户端发送过来的一个请求,服务器端会发送一个响应,然后开始计时,
TCP的Keepalive,是挂羊头卖狗肉的,目的在于看看对方有没有发生异常,如果有异常就及时关闭连接。
当传输双方不主动关闭连接时,就算双方没有交换任何数据,连接也是一直有效的。
如果这个时候对端、中间网络出现异常而导致连接不可用,本端如何得知这一信息呢?
1)第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,SequenceNumber为x;然后,客户端进入SYN\_SEND状态,等待服务器的确认;
2)第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置AcknowledgmentNumber为x+1(SequenceNumber+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,SequenceNumber为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN\_RECV状态;
3)第三次握手:客户端收到服务器的SYN+ACK报文段。然后将AcknowledgmentNumber设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
那四次分手呢?
当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”。
1)第一次分手:主机1(可以使客户端,也可以是服务器端),设置SequenceNumber和AcknowledgmentNumber,向主机2发送一个FIN报文段;此时,主机1进入FIN\_WAIT\_1状态;这表示主机1没有数据要发送给主机2了;
2)第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,AcknowledgmentNumber为SequenceNumber加1;主机1进入FIN\_WAIT\_2状态;主机2告诉主机1,我“同意”你的关闭请求;此时主机2进入CLOSE\_WAIT状态
3)第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST\_ACK状态;
4)第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME\_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
5)六大标志位
SYN,同步标志位;ACK确认标志位;PSH传送标志位;FIN结束标志位;RST重置标志位;URG紧急标志位;seq序号;ack确认号
因为当处于LISTEN状态的服务器端收到来自客户端的SYN报文(客户端希望新建一个TCP连接)时,它可以把ACK(确认应答)和SYN(同步序号)放在同一个报文里来发送给客户端。但在关闭TCP连接时,当收到对方的FIN报文时,对方仅仅表示对方已经没有数据发送给你了,但是你自己可能还有数据需要发送给对方,则等你发送完剩余的数据给对方之后,再发送FIN报文给对方来表示你数据已经发送完毕,并请求关闭连接,所以通常情况下,这里的ACK报文和FIN报文都是分开发送的。
所以采用两次握手,有可能会浪费Server的网络资源。还有,通过seq号和ACK号协商接下来发送数据的开始序号
答案是可能的。
传输进程到进程的逻辑通信,即所说的端到端的通信,而网络层完成主机到主机之间的逻辑通信;
2)TCP面向字节流,UDP面向数据包;
字节流:发送端执行的写操作数和接收端执行的读操作数之间没有任何数量关系。
3)TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
4)UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
5)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
6)TCP对系统资源要求较多,UDP对系统资源要求较少。
7)若通信数据完整性需让位与通信实时性,则应该选用TCP协议(如文件传输、重要状态的更新等);反之,则使用UDP协议(如视频传输、实时通信等)。
8)UDP:DNSSNMP(???)
1)网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。
2)TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置的系统协议栈中,极难对其进行改进。
3)采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。
1、差错TCP16位校验和(丢弃等超时重传)
3、失序序号(根据序号重排)
4、重复序号(根据序号丢弃)
1.TCP通信建立在有连接的基础上,如发起connect连接
2.序号
TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据看成无结构的有序的字节流。表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个datastream中所在的位置。
3.发送应答机制、确认
发送端发出的每一个TCP报文段必须得到对端的应答,才认为这个TCP报文段接收成功。
TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号;
4.超时重传
5.流量控制
TCP采用大小可变的滑动窗口进行流量控制,窗口大小的单位是字节。
发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。
1)窗口
接受窗口rwnd,接收端缓冲区大小。接收端将此窗口值放在TCP报文的首部中的窗口字段,传送给发送端。拥塞窗口cwnd,发送缓冲区大小。发送窗口swnd,发送窗口的上限值=Min\[rwnd,cwnd\]
6.拥塞控制
TCP报文段最终以IP数据包发送的,而IP数据包到达接收端可能乱序、重复,TCP对接收到的TCP报文段重排、整理,再交付给应用层。TCP头部有个16位校验和。接收端对TCP报文段执行CRC算法来检测TCP报文段在传输过程中是否损坏。
流量控制与拥塞控制的区别
所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能承受现有的网络负荷。流量控制往往指的是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。