计算机网络

首先用一张图来介绍网路模型:

分别是七层,其中最重要的是传输层和应用层

应用层

是应用软件的接口:通常用到的协议有 HTTP,HTTPS,FTP,SSH,其他的还有TELNET、SMTP等

HTTP协议

超文本传输协议,端口号默认为80

请求方式

  • GET 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中
  • HEAD 与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。
  • POST 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)
  • PUT 向指定资源位置上传其最新内容。
  • DELETE 请求服务器删除Request-URI所标识的资源。
  • TRACE 回显服务器收到的请求,主要用于测试或诊断。
  • OPTIONS
  • CONNECT

状态码

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

报文格式

HTTPS

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure

严格地讲,HTTPS并不是一个单独的协议,而是对工作在一加密连接(TLS或SSL)上的常规HTTP协议的称呼。

HTTPS的信任继承基于预先安装在浏览器中的证书颁发机构

HTTPS有以下特点:

  1. 内容加密:采用混合加密技术,中间者无法直接查看明文内容

  2. 验证身份:通过证书认证客户端访问的是自己的服务器

  3. 保护数据完整性:防止传输的内容被中间人冒充或者篡改

    利用了非对称加密:首先对原文进行公钥加密,然后接收方私钥解密,那么公钥何来?就在数字证书当中,证书中包含了一个秘钥对(公私钥)和识别这的信息,数字证书放到Service,来进行数据传输加密和服务器验证。

与HTTP的区别

  • HTTP端口号80,端口号:443
  • HTTPS是安全的

传输层

TCP

传输控制协议(英语:Transmission Control Protocol,缩写:TCP

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

各个字段的含义

来源通信的端口和目的通信的端口分别为2个字节

  • 序列号(seq): 如果包含同步标识SYN=1,则此为最初的序列号;如果没有同步化旗标(SYN),则此为第一个数据比特的序列码

  • 确认号(ack) :期望收到数据的开始序号,即已收到数据长度+1

  • 数据偏移:计算出与开始的偏移值

  • 保留:都是0

  • 标志位:几个关键的字段

    • SYN—为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
    • FIN—为1表示发送方没有数据要传输了,要求释放连接
    • ACK—为1表示确认号字段有效

三次握手

三次握手可以描述为(我要和你握手,你真的要和我建立连接吗?我真的要和你建立连接)

  • 第一次握手:Client 的SYN标志位1,随机产生一个seq=x,并且将数据发送给Service,Client进入到了SYN_SENT状态。
  • 第二次握手,Service收到客户端的标志,将ack值为J+1,随机产生一个seq值,发给Client并且发给客户端进行确认,Service进入到了SYN_RCVD状态
  • 第三次握手,Client收到确认后,检查ack是否为J+1,并且将ack设置为k+1,发送给Service,Service判断为K+1则为建立成功,Service进入到ESTABLISHED状态

任何一次未收到,则都会重发

为什么是三次?

为了防止失效的链接重传,比如Client发送一个请求网络延迟,然后重试,重试后与服务端建立连接,当数据结束的时候服务端关闭,客户端关闭,这时候延迟的请求到了,如果只有两次的话那么又建立连接了,那么这时候客户端已经关闭了呀,服务端只能苦等了

四次挥手:

四次断开可以理解为(我要和你进行断开连接,好的断开吧,我也要和你断开连接,好的断开吧)

  • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入到了FIN_WAIT_1状态

  • 第二次挥手:Service收到了FIN之后,发送给一个act,service进入到CLOSE_WAIT状态,即客户端已经没有要发送的数据了,服务端要发送数据,客户端还是要接收的,这时候客户端的连接已经断开了,服务端的连接还没有断开

  • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

为什么要进行四次挥手?

TCP是全双工的,即:双方都可以发送数据,那么断开连接意味着,双方都可以发送数据

那么前两次完成后进入到办链接状态,即一放已经断开了链接,但是另一方还可能有数据要处理,等全部处理完发送一个FIN的包,Client进行返回,这时候才真正完成了链接

这有点类似于分手,双方都是同意分手的,但是双方要彻底断了关系就要把双方的东西都邮寄过去,那么男方:我要跟你分手,这是你留在我家的东西;女方:我收到了你给我的东西了,但是你在我家的东西,等我收拾完了再给你。女方:你的东西收拾完了给你;男方:好的我收到了。

为什么TCP是可靠的

无差错传输:即传输信息不会出错

滑动窗口协议:

  • 发送方:任何时候,提供了一组连续的序号,(对发送方的流量控制)
  • 接收方:任何时候,接收一组连续的序号(即接收方当收到的序号落入接收窗口才可以继续)

对于发送端:要发送5个帧,将5个全发送,此时窗口还在首位,接收到一个确认帧后向后移动一位

只有确认了所有确认帧,窗口才可能滑动

停止-等待协议、后退N帧协议 & 选择重传协议只是在发送窗口大小和接收窗口大小上有所差别

UDP

用户数据包协议(英语:User Datagram Protocol,缩写:UDP

与TCP的报文头16字节相比,UDP的报文头只有4个字节相对来说比较简单

与TCP的区别无连接的、不可靠的、面向报文、无拥塞控制、传输效率高、所需资源少,

socket

由于每个主机系统都有各自命名进程的方法,而且常常是不兼容的,因此,要在全网范围内硬把进程名字统一起来是不现实的。所以,每个计算机网络中都要引入一种起介质作用的、全网一致的标准名字空间。这种标准名字,在ARPA网中称作套接字,而在很多其他计算机网中称作信口。

  • Socket不是一种协议,而是一个编程调用接口(API),属于传输层(主要解决数据如何在网络中传输)
  • Socket,我们才能在Andorid平台上通过 TCP/IP协议进行开发
  • 对用户来说,只需调用Socket去组织数据,以符合指定的协议,即可通信

socket创建链接的过程

socket的两种使用方式

流套接字(steamsocket)基于TCP协议

数据报文套接字(datagramsocket)基于 UDP协议

与HTTP的区别

一个在应用层一个在网络层,二者不可同日而语

但是随着计算机网络的发展HTTP

HTTP通过响应请求的方式请求(Client需要的时候才发送)

socket通过服务器主动发送数据的方式请求(Service有需要的时候才进行发送)

https://www.jianshu.com/p/65605622234b

谢谢您的鼓励~