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读取了所有的数据。

热门相关:总裁的秘密爱人   紫府仙缘   一等狂妃:邪王,请接招!   隐婚试爱:娇妻,好甜!   嫡嫁千金