网络通信里的四个问题归纳:TCP连接与断开的过程、TCP编程实操、TCP怎么解决网络通信中的丢包问题、TCP/IP四层模型
图片引自网络
TCP连接与断开的过程
对于TCP的连接的三次握手和四次挥手,只需要记住下面两张图
三次握手
在上图中,主要出现的保证可靠性的措施是:序列号、确认应答
四次挥手
TCP编程
使用TCP建立服务端、客户端的流程如下:
TCP是面向连接的,而UDP是无连接的,因此对于UDP:
在服务端,无listen、accept
在客户端,无connect
对应的
recv
、send
分别改为:recvfrom
、sendto
等
为简单起见,这里以python版本展示使用流程
服务端举例(python)
import socket socket_server = socket.socket() socket_server.bind(("localhost", 8888)) socket_server.listen(1) conn, address = socket_server.accept() # 阻塞式,等待客户端的连接 while True: data: str = conn.recv(1024).decode("UTF-8") # 阻塞式 print(f"客户端发来的消息是:{data}") msg = input("请输入你要回复客户端的消息:") if msg == 'exit': break conn.send(msg.encode("UTF-8")) # encode将字符串编码为字节数组对象 conn.close() socket_server.close()
客户端举例(python)
import socket socket_client = socket.socket() socket_client.connect(("localhost", 8888)) while True: send_msg = input("请输入要发送给服务端的消息:") if send_msg == "exit": break socket_client.send(send_msg.encode("UTF-8")) recv_data = socket_client.recv(1024).decode("UTF-8") print(f"服务端回复的消息是:{recv_data}") socket_client.close()
注意到,服务端的数据收发使用的是conn,而不是socket对象socket_server
这样可以使得一个服务器可以和多个客户端分别建立点到点的连接
TCP怎么解决网络通信中的丢包问题
使用重传机制、拥塞控制解决,具体描述如下:
这个问题属于可靠性传输的一部分,而TCP使用序列号、确认应答、重传机制、滑动窗口、流量控制、拥塞控制实现可靠性传输,分别叙述如下:
-
序列号、确认应答
实现可靠传输的方式之一
-
重传机制
针对数据包丢失的情况使用
超时重传、快速重传、SACK、D-SACK四种
-
滑动窗口
提高通信效率的方式
发送方无需等待确认应答,可以继续发送数据的最大值
-
流量控制
考虑接收方处理能力,防止因对方处理不过来,触发重发机制导致的网络流量无端浪费的情况
接收窗口过小时阻止对方发数据过来,
小数据的传输会使网络总体的利用率低
-
拥塞控制
网络出现拥塞时,继续发送大量数据包会导致数据包时延、丢失等,然后TCP重传会导致网络负担更重,并恶性循环
拥塞控制能避免发送方数据填满整个网络
拥塞控制算法:慢启动(一点一点提高发送数据包的数量(指数增长))、拥塞避免(线性增长)、拥塞发生、快速恢复
对于拥塞发生,有以下两种情况:
-
对超时重传,使用慢启动
-
对快速重传,使用快速恢复
-
TCP/IP四层模型
TCP/IP四层模型各层作用:
-
应用层
用户与应用程序交互
-
传输层
提供端到端(应用程序到应用程序)的数据传输服务,保证数据可靠传输(TCP协议)
-
网络层
主机到主机之间的通信,确保数据能到达目标网络
-
链路层
提供MAC地址,处理数据在物理媒介中的实际传输
MAC地址,用于在局域网内标识设备,在网络中唯一标示一个网卡