linux c++ tcp
1. TCP/IP协议栈
链路层:负责下图所示物理链接标准
IP层(网络层):选择合适的路径传输数据,无法解决数据传输错误问题,所以需要TCP/UDP协议作为保障
TCP/UDP(传输层):IP层(网络层)解决传输路径问题,确定了路径,就进行传输数据,IP层只关注一个数据包如何进行传输,至于传输过程数据包是否损坏,传输多个包顺序的控制,IP层无法解决,上述的问题都由TCP/UDP(传输层解决),TCP/UDP(传输层)在IP层(网络层)之上,决定主机之间数据传输方式,给不可靠IP协议赋予可靠性。
应用层:提供封装将上述的几个层进行封装,提供给外部socket(套接字)让我们进行编程,我们进行编写的代码一般都是在编写应用层协议。
2. 实现基于TCP的服务器与客户端
2.1 TCP服务器默认调用函数顺序
调用socket函数创建套接字,声明并初始化地址信息结构体变量,调用bind函数向套接字分配地址。
2.1.1 进入等待请求连接状态 listen()
服务端调用listen()函数进入等待请求连接状态,等待客户端连接,此时客户端才可以调用connect()函数进行连接。
2.1.2 受理客户端连接请求
2.2 客户端调用顺序
2.2.1 客户端向服务端请求连接
2.2.2 客户端套接字信息赋值
2.3 基于TCP的服务端/客户端函数调用关系
3. TCP原理
3.1 TCP套接字中的/O缓冲
3.2 TCP内部工作原理1:与对方套接字的连接
3.3 TCP内部工作原理2:与对方主机的数据交换
3.4 TCP的内部工作原理3:断开与套接字的连接
TCP存在粘包问题(TCP没有数据边界),
解决方式:
1. 发送固定长度的消息
2. 把消息的尺寸与消息一块发送
3. 使用特殊标记来区分消息间隔
我解决的方式是客户端在发送的时候确定发送的数据长度,客户端接受服务端的数据每次读取一个字节,
如果确定客户端之前发送了20个字节的数据那么,循环read20次读取,但是实际实现的时候一般是一次性就读取了一次read读取了所有的数据。