网络编程基础知识

Tcp/ip的握手和挥手不须要咱们去处理,由于咱们进行网络编程是使用socket套接字,而socket已经处理好了这些操做。可是咱们仍是要学习tcp/ip的原理,毕竟技多不压身,多学点东西老是好的。本文中做者将从问题入手介绍一下网络编程中的基础知识,包括三次握手、四次挥手、http请求相关内容、socket基础知识等,但愿能对你们有所帮助。
html


1.TCP创建链接为何要三次握手编程

TCP创建链接时三次握手是为了保证客户端和服务端的读写功能都正常,第一次握手由客户端发起,服务端接收到了之后就能够证实客户端的发送功能正常。第二次握手服务端回信,告知客户端接收到了,此举能够证实服务端的接收功能都正常。可是服务端并不知道客户端是否能读,因此须要进行第三次握手,客户端告知服务端其发送的数据已接收,至此便成功保证了客户端和服务端均能读能写。浏览器

接下来咱们经过抓包工具实际来查看一下整个三次握手过程,这里须要用到wireshark抓包工具,由于charles、fiddler上面抓包看不到这么详细的数据包信息。咱们打开wireshark,而后发送一条http请求。能够看到,本机向服务端发送了序列号为0的数据,服务端给本机发送了一条响应号Ack为1(序列号+1)的数据,客户端收到之后发送一条序列号为1(第二次发送序列号要+1)、响应号为1的数据(服务端发送的序列号+1)。总结一下,至关于每次后者响应值是前者的序列号+1,用来证实数据获取正确。
安全


2.TCP断开链接为何要四次挥手网络

当客户端和服务端数据交互结束时,不能一直保持在连线状态,须要将链接断开。这里既有多是客户端提出断开也有多是服务端提出,本次就以客户端提出为例来讲。socket

挥手的过程和握手很相似。当客户端发起断开链接的请求FIN,即第一次挥手,表明客户端不会再发送其余数据给服务端,服务端会当即返回一个响应值为ack=seq+1的数据,可是这并不表明服务端真正关闭链接的,由于有可能服务端还有向客户端发送的数据还并无传输完,因此要等传输完之后再发送一个新的序列号为y的数据包给客户端,客户端接收到了这个新包之后继续发送一个响应值为y+1的包给服务端,当服务端接收到该包之后双方才会真正关闭链接。这就是创建链接须要3次,可是挥手就要进行四次握手的缘由。
tcp


3.Http的各版本功能工具

在http0.9中只支持get命令,而且服务端只能返回html格式字符串,发送完就关闭tcp链接学习

在http1.0中能够发送任何格式内容,也支持更多请求方式,还能够加入头信息优化

在http1.1中引入持久链接,一次握手能够发送多个请求,固然双方也能够在请求头中设置connection close来关闭持久链接。这是目前使用最多的http版本。

SPDY协议由谷歌提出,必须使用https,已经被淘汰了

在http2.0中全部的response数据都变成了二进制格式,因此可读性差,可是解析更高效。同时http2.0支持了服务端主动推送数据到客户端。




4.Http报文格式

http报文分为请求行、请求头、请求数据,在如下的例子中第一行是请求行,给了一个host请求头,最后获得了请求数据,其中包括响应头和响应数据。



5.响应状态码

请求之后响应码有不少,其中2xx表明请求成功。数量太多,就不一一说明,下面列举出一部分,不在其中的须要另外去找相关资料。


6.请求头有哪些

请求头的数量也不少,这里举两个例子,就不一一阐述了。

Connection:当不须要创建长链接,接口请求完就关闭链接时将Connection设为close

Range:断点续传时使用



7.响应头有哪些

和请求头相似,响应头也有不少种,这里也举个例子,就不一一阐述了。

Content-Type:返回内容的类型,告知客户端本次获取的数据是什么类型的


8.如何用jdk自带的socket完成http请求

其实就是拼接出来请求内容,而后写入链接好服务端的socket中,这里HttpCodec只是为了将数据打印出来而封装的一个工具类,具体代码以下:


9.如何用jdk自带的socket发送HTTPS请求

HTTP在传输数据时,全部传输的内容都是明文,没法保证数据的安全性。(帐号、密码、我的信息等隐私)

网景在1994年建立了HTTPS,HTTPS就是安全版的HTTP。

须要注意的是,若是使用的证书没有通过认证,即服务端所用的证书不在设备的信任证书列表中,该列表能够在浏览器的选项-安全中查看,手机上能够经过设置-证书查看。若使用的证书不被设备信任,则发起该https接口请求时须要传入该证书到socket中,具体方法以下:


总结:今天分享了三次握手、四次挥手的功能以及实现方式,而后介绍了http的发展历程以及各版本区别,接下来介绍了请求头和响应头的种类,最后利用socket发起了一次最简单的http和https请求。可是网络编程的知识远远不止如此,还有不少的东西须要学习,好比更复杂的请求、长链接优化、OKHTTP源码阅读解析等等很是多。活到老学到老,只有学习才是通往优秀码农的惟一途径,等后面有空再继续更新。