哎哟哟,听说你TCP/IP协议掌握得不错呢,进来看看有你不会的吗?

1. TCP简介

  • TCP是面向连接的、可靠的,基于字节流的传输层通信协议
  • 将应用层的数据流分割成报文段并发送给目标节点的TCP层
  • 数据包都有序号,对方收到则发送ACK确认,未收到则进行重传
  • 使用校验和来检验数据在传输过程中是否有损失

2. TCP

2.1 TCP中重要的控制位(Control Flag)

  1. ACK:确认序号标志
  2. SYN:同步序号,用于建立连接
  3. FIN:用于释放连接
  4. URG:紧急指针标志
  5. PSH:push标志
  6. RST:重置连接标志

3. 三次握手,握手为了你我之间的联系

  1. 第一次握手:建立连接时,用户端发送SYN包到服务器,等待服务器确认
  2. 第二次握手:服务器收到SYN包,必须确认客户的SYN,同时发送SYN+ACK包给客户端
  3. 第三次握手:客户端收到SYN+ACK包后,向服务器发送确认包ACK,此包发送完毕,服务器接收,进入连接状态

3.1 为什么需要三次握手才能建立连接?

为了初始化Sequence Number的初始值,如图上的seq,要进行互相通知,作为以后数据通信的序号,保证以后传输的数据正确性,防止乱序

3.2 建立连接后,client出现故障怎么办?

  • 服务器的保护机制

由服务器向客户端发送保活探测报文,如果未收到响应则继续发送,直到达到保活探测次数仍未收到回应,则会中断连接

4. TCP的四次挥手

  1. 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传输
  2. 第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认需要为收到的序号+1
  3. 第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传输
  4. 第四次挥手:客户端在收到服务器发送的FIN后,发送一个ACK给服务器,确认序号为收到的序号+1,与服务器的连接进入关闭状态,完成四次挥手

4.1 为什么第四次挥手后,客户端再等待2MSL才能关闭连接?

  1. 确保有足够的时间让服务器收到ACK包
  2. 避免新旧连接的混淆

4.2 为什么四次挥手才能断开连接?

因为客户端和服务器是全双工通信,发送方和接收方都需要发送FIN包和接受ACK包才能断开连接,由一端先发起断开连接的请求,所以看起来像四次挥手。

全双工通信:又称为双向同时通信,即通信的双方可以同时发送和接收信息的信息交互方式。

5. UDP

5.1 UDP报文头

  • 特点:
  1. 面向非连接,不维护连接状态,支持同时向多个客户端传输相同的信息
  2. 数据包报头只有8字节,额外开销较小,
  3. 吞吐量只受限于数据生成速率,传输速率以及计算机的性能
  4. 尽最大努力交付,不保证数据的可达
  5. 面向报文,不对应用程序提交的报文信息进行拆分或者合并

5.2 TCP与UDP的区别

  1. 面向连接VS面向无连接
  2. 可靠性VS不保证可靠性
  3. 数据有序性VS数据无序性
  4. 速度慢VS速度快(UDP应用于视频、广播等)
  5. 重量级VS轻量级

6. TCP滑动窗口

  • RTT:发送一个数据包到收到一个ACK所需的时间
  • RTO:重传时间间隔
  • TCP利用滑动窗口实现流量控制,并保证TCP的可靠性

6.1 高速重发机制

在窗口较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回(比如第1001~2000数据丢失,那么接受端会不断地返回下一个数据是1001的应答),而发送端主机接收到连续3次同一个应答,就会对其进行重发。

6.2 流量控制

如果接收端将本该接收到的数据丢弃的话,就会引起重发机制,从而导致流量的浪费。接收端向发送端主机通知自己能够接收数据的大小,于是发送端会发送不超过该数据大小的数据。该数据大小限度就是窗口的大小,是由接收端主机决定的。TCP首部报文中包含窗口大小的数据。

7. HTTP

7.1 特点

  1. 支持客户/服务器模式
  2. 简单快速
  3. 灵活
  4. 无连接
  5. 无状态,对事务处理没有记录

7.2 请求和响应的步骤

  1. 客户端连接到web服务器
  2. 发送http请求
  3. 服务器接收请求并返回http响应
  4. 释放tcp连接
  5. 客户端浏览器解析HTML内容

7.3 在浏览器输入URL地址,按下回车键之后发生了什么?

  1. DNS解析(将对应的地址解析为IP地址)
  2. TCP连接(三次握手)
  3. 发生HTTP请求
  4. 服务器处理请求并返回HTTP报文
  5. 浏览器解析渲染页面
  6. 断开连接(四次挥手)

7.4 HTTP状态码

  • 1XX:指示信息
  • 2XX:成功
  • 3XX:重定向
  • 4XX:客户端错误
  • 5XX:服务器端错误

7.4.1 常见的状态码

  • 200 OK
  • 400 Bad Request:客户端请求语法错误
  • 401 Unauthorized:请求未经授权
  • 403 Forbidden:服务器收到请求,但是拒绝访问
  • 404 Not Found
  • 500 Internal Server Error:服务器发生不可预期的错误
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常

7.5 Get和Post的区别

  • Http报文层面:Get请求放在URL地址上;Post放在报文体内
  • 数据库层面:Get是查询操作;Post会改变数据库的数据
  • Get可以被缓存,被存储;Post不能

7.6 Cookie和Session

7.6.1 Cookie

  • 是由服务器发给客户端的特殊信息,以文本的形式存放在客户端
  • 客户端再次请求的时候,会把Cookie回发
  • 服务器接收到后,会解析Cookie生成相应的内容

7.6.2 Session

  • 服务器端的机制,在服务器上保存信息
  • 解析客户端请求并依据Session Id返回信息

7.6.3 两者的区别

  • Cookie数据存放在客户端的浏览器上,Session数据存放在服务器上
  • Session相对于Cookie更安全

(若考虑减轻服务器负担,应当使用Cookie)

8. HTTPS

8.1 SSL(Security Sockets Layer,安全套接层)

  • 为网络通信提供安全及数据完整性的一种安全协议
  • 是操作系统对外的API,SSL3.0后更名为TLS
  • 身份验证和数据加密,保证网络通信的安全和数据的完整性

8.2 加密的方式

  1. 对称加密:加密和解密都使用同一个密钥
  2. 非对称加密:加密和解密使用不同的密钥(公钥和私钥,安全,但是效率低)
  3. 哈希算法:将任意长度的信息转换为固定长度的值,算法不可逆转
  4. 数字签名:证明某个消息和文件是某人发出的/认同的

8.3 HTTPS数据传输流程

  • 浏览器将支持的加密算法发送给服务器
  • 服务器选择一套浏览器支持的加密算法,以证书的形式发给浏览器
  • 浏览器验证证书的合法性,并结合证书公钥加密信息发送给服务器
  • 服务器使用私钥解密信息,验证哈希,加密相应消息后回发浏览器
  • 浏览器解密相应消息,并对消息进行验证,之后进行加密加护数据

8.4 HTTPS和HTTP的区别

  1. HTTPS需要到CA申请证书,HTTP不需要
  2. HTTPS密文传输,HTTP明文传输
  3. 连接方式不同,HTTPS默认使用443端口,HTTP使用80端口
  4. HTTPS=HTTP+加密+认证+完整性保护,较HTTP安全

8.5 HTTPS真的安全吗?

  • 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
  • 可以使用HSTS优化

相关文章

Java编程-TCP JAVA编程手机软件

1.1. Java的TCP面向连接, 数据安全, 区分服务器端和客户端.TCP分为Socket(客户端)和ServerSocket(服务端)需要分别建立客户端和服务器端客户端和服务端建立连接后,通过S...

Java网络编程---TCP通信 java的tcp通讯协议数据传输

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信Java对基于TCP协议的网...

用 Wireshark 让你看见 TCP 到底是什么样

前言当你看到这篇文章时,你只能看到已经渲染好的文字和图像,而网络数据的交互对我们来说,却是看不见的,所以学习计算机网络原理的时候就会觉得非常的抽象,这一度让我苦恼。而且网络数据交换真实的模样,到底是不...

一文带你搞定TCP流量控制 tcp流量控制算法

摘要理想的流量控制实际的流量控制窗口关闭糊涂窗口综合征理想的流量控制什么是流量控制?流量控制就是发送方不能无脑的给接收方发送数据,它需要根据接收方的处理能力来发送数据。理想下的流量控制?理想意味着在实...

有关TCP协议,这是我看过讲的最清楚的一篇文章了!

TCP 协议是网络传输中至关重要的一个协议,它位于传输层。向上支持 FTP、TELNET、SMTP、DNS、HTTP等常见的应用层协议,向下要与网络层的 IP 协议相互配合,实现可靠的网络传输。分层网...

Java的UDP和TCP使用方法和案例 java udp socket编程主要用到的两个类

一.UDP1.UDP发送数据2.UDP接收数据bys若直接转换成String进行输出,若发送的数据没占满数组那么大则会输出一堆空字符串二.TCP1.TCP发送数据Socket 里直接用IP地址,这个构...