http 与 tcp 知识点

294 阅读11分钟

tcp 与 http 关系

tcp 三次握手 与 四次 挥手的解释

三次握手 有一种 电话通信的感觉, 甲:能听到吗?

三次握手建立连接阐述: 第一次握手:客户端要和服务端进行通信,首先要告知服务端一声,遂发出一个SYN=1的连接请求信号,”服务端哥哥,我想给你说说话”。

第二次握手:当服务端接收到客户端的连接请求,此时要给客户端一个确认信息,”我知道了(ACK),我这边已经准备好了,你现在能连吗(SYN)”。

第三次握手:当客户端收到了服务端的确认连接信息后,要礼貌的告知一下服务端,“好的,咱们开始联通吧(ACK)”。

到此整个建立连接的过程已经结束,接下来就是双方你一句我一句甚至同时交流传递信息的过程了。

四次挥手断开连接阐述: 第一次挥手:双方交流的差不多了,此时客户端也已经结尾了,接下来要断开通信连接,所以告诉服务端“我说完了(FIN)”,此时自身形成等待结束连接的状态。

第二次挥手:服务端知道客户端已经没话说了,服务端此时还有两句心里话要给客户端说,“我知道你说完了(ACK),我再给你说两句,&*……%¥”。

第三次挥手:此时客户端洗耳恭听继续处于等待结束的状态,服务器端也说完了,自身此时处于等待关闭连接的状态,并对告诉客户端,“我说完了,咱们断了吧(FIN)”。

第四次挥手:客户端收知道服务端也说完了,也要告诉服务端一声(ACK),因为连接和断开要双方都按下关闭操作才能断开,客户端同时又为自己定义一个定时器,因为不知道刚才说的这句话能不能准确到达服务端(网络不稳定或者其他因素引起的网络原因),默认时间定为两个通信的最大时间之和,超出这个时间就默认服务器端已经接收到了自己的确认信息,此时客户端就关闭自身连接,服务器端一旦接收到客户端发来的确定通知就立刻关闭服务器端的连接。

到此为止双方整个通信过程就此终结。这里要声明一下:断开链接不一定就是客户端,谁都可以先发起断开指令,另外客户端和服务端是没有固定标准的,谁先发起请求谁就是客户端。

问题: 1.为什么断开链接的时候客户端设置的定时器时间等待要2MSL(两个通信报文的最大时间)? 这个问题也很好理解,当客户端最终告诉服务器端断开确认的时候,他不知道自己的发出的指令是否能准确的一次性被服务器接收。假如服务器没有接收到(这已经耗费了一个报文的最大通信时间了),服务器端将会重新发起一个结束通话的指令(FIN)到客户端,客户端又接收到了服务器发来的结束通信指令将继续给服务器进行一个确认,有人会说那要是客户端发出的确认信息服务端没收到,而服务端重发的断开指令客户端也没收到怎么办,说实话我也无奈,遇到这种情况咱们干脆认为网确实不行了。

2.为什么建立连接要三次握手而断开连接要四次挥手? 说起这个,打一个比喻,目前祖国正在高速发展高铁,建立连接的过程正如上海到北京打通一条高铁线,TCP通信过程是一个全双工模式,即在这条高铁线上要有两个轨道,即能从上海发车到北京又能从北京发车到上海,甚至两边可以同时发车。所以断开连接前提就是要保证两条轨道都没有车,然后双方才能各自发起断开动作。

个人理解

三次握手:

A: 能听到吗? B: 我能听到,你能听到我吗? A: 我也能

http 协议特点

  1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。

  3. 无连接

对HTTP有点了解的童鞋应该都知道,HTTP协议是无连接的。 也就是说,每进行一次HTTP通信,都要断开一次TCP连接。 这是因为HTTP诞生之初,主要是为了应付容易很小的文本传输,所以即使这样也没多大的问题。 可随着HTTP的普及,文档中包含大量图片的情况多了起来,每次请求完都要断开TCP连接,无疑增加通信量的开销。 为了解决TCP的连接问题,HTTP1.1提出了持久连接的方法。 所谓的持久连接,就是任意一端只要没有明确提出断开连接,则保持TCP连接状态。 这样一来,就减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务端的负载,Web页面的显示速度也就相应的提高了。 更重要的是,持久连接使得管线化成为可能。从前发送请求后,需要收到响应了才能发送下一个请求。管线化技术出现后,不用等待响应也可以直接发送下一个请求了。 这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应。 管线化的效果是立竿见影的。持久连接可以让请求更快结束,而管线化技术则比持久连接还要快,而且请求数越多,时间差就越明显。

  1. 无状态 除了无连接,HTTP的另一个特点是无状态。 也就是说,HTTP协议无法根据之前的状态进行本次的请求处理。 不可否认,不保存状态是有他的优点的,可以减少服务器的CPU及内存资源的消耗。但问题也是显而易见。 假设系统需要登录后才能访问,由于无状态的特点,每次跳转页面都需要重新登录,这是难以想象的。 为了解决无状态的问题,引入了Cookie技术。 Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。 首次访问服务端时,响应报文内会返回一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。 服务端发现客户端发送过来的Cookie后,会去检查究竟是从哪个客户端发送来的请求,然后对比服务器上的记录,最后得到之前的状态信息。 有关请求报文和响应报文内的Cookie对应的首部字段,接下来还会详细介绍。

http 方法 get/post/PUT/DELETE/Option/Trace/Connect/Patch

post 和 get的区别

参见 learnku.com/articles/25…

http 状态码

参见文章: www.runoob.com/http/http-s…

什么是持久连接

HTTP keep-alive, a.k.a., HTTP persistent connection, is an instruction that allows a single TCP connection to remain open for multiple HTTP requests/responses.

保持 tcp 连接

什么管线化

HTTP管线化可以克服同域并行请求限制带来的阻塞,它是建立在持久连接之上,是把所有请求一并发给服务器,但是服务器需要按照顺序一个一个响应,而不是等到一个响应回来才能发下一个请求,这样就节省了很多请求到服务器的时间。不过,HTTP管线化仍旧有阻塞的问题,若上一响应迟迟不回,后面的响应都会被阻塞到。

http 与 https 区别

http2 特点

优势 目前,互联网使用的HTTP协议版本是HTTP1.1,HTTP/2在HTTP1.1的基础上对性能进行了很大的优化,并且兼容了HTTP1.1的语义。

HTTP/2和HTTP1.1比较主要有如下几大优势:

二进制分帧 HTTP/2采用二进制格式传输数据,而HTTP1.1采用文本格式传输数据。二进制格式传输在协议的解析和优化扩展上更具优势,提升了数据传输效率。

头部压缩 HTTP/2对消息头采用HPACK格式进行压缩传输,并在客户端和服务端通过“头部表”来跟踪和存储消息头,相同的消息头只需通过索引从“头部表”中获取并使用之前已经请求发送过的消息头。

HTTP/2通过头部压缩, 解决了HTTP1.1每次请求都会携带大量的头部冗余信息而浪费带宽资源的问题,节省了消息头占用的网络和流量。

多路复用 在HTTP/2中,多个请求或者响应可以通过一个TCP连接并发完成,而HTTP1.1中每个请求或者响应都需要按照先后顺序建立一个TCP链接。HTTP/2通过有效地并发请求,减少了服务器链接压力,缓解了网络阻塞状况。

服务器推送 在HTTP/2中,服务端可以主动推送资源给客户端,无需客户端发起请求。当用户需要服务端推送的这些资源时,可以直接从客户端获取,从而有效提升缓存命中率。

http 缓存

TCP 与 UDP

cloud.tencent.com/developer/a…

OSI七层网络模型与TCP/IP四层网络模型

cloud.tencent.com/developer/a…

什么是socket

A socket is one endpoint of a two-way communication link between two programs running on the network. A socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent to.

socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等。而TCP和UDP协议属于传输层 。 http是个应用层的协议,它实际上也建立在TCP协议之上。 (HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。) 2)Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口

现在我们了解到TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket。现在我们知道,Socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。

two socket

server socket

connection

client socket

socket 编程

The entire process can be broken down into following steps:

The entire process can be broken down into following steps:

TCP Server –

using create(), Create TCP socket. using bind(), Bind the socket to server address. using listen(), put the server socket in a passive mode, where it waits for the client to approach the server to make a connection using accept(), At this point, connection is established between client and server, and they are ready to transfer data. Go back to Step 3. TCP Client –

Create TCP socket. connect newly created client socket to server.

https 加密

https 使用非对称加密和对称加密, 使用非对称加密建立连接和出创建秘钥,之后是对称加密

All HTTPS connections between clients and servers use both Asymmetric and Symmetric encryption, whereby Asymmetric encryption is used in establishing connections and then replaced by Symmetric encryption for the entire connection duration, which is also known as the session.

重要文章

zhuanlan.zhihu.com/p/43789231

HSTS

用来解决 http 跳转到 https 的问题

参考文章 - www.jianshu.com/p/18e541686…