Linux下的网络通讯

UDP:用户数据报协议 传输层

特点:

1.无连接

2.不安全、不可靠

3.面向报文

4.占用资源开销小

TCP : 传输控制协议 传输层

  1. TCP特点:

1.面向连接

2.安全、可靠

3.面向字节流

4.占用资源开销大

三次握手:

指建立tcp连接时,需要客户端和服务端总共发送三次报文确认连接。

四次挥手:

断开一个tcp连接,需要客户端和服务端发送四个报文以确认断开。

  1. 编程模型

client: socket--->connect--->send/write--->close

server: socket--->bind--->listen--->accept---> recv/read--->close

  1. 函数接口:

1.socket

socket(AF_INET, SOCK_STREAM, 0);

2.connect

int connect(int sockfd, const struct sockaddr *addr,

socklen_t addrlen);

功能:

发送三次握手链接请求

参数:

sockfd:套接字文件描述符

addr:存放目的地址空间首地址

addrlen:目的地址长度

返回值:

成功返回0

失败返回-1

3.send

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

功能:

发送数据

参数:

sockfd:套接字文件描述符

buf:存放数据空间首地址

len:数据长度

flag:属性默认为0

返回值:

成功返回发送字节数

失败返回-1

4.recv

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

功能:

接收数据

参数:

sockfd:套接字文件描述符

buf:存放数据空间首地址

len:最多接收数据长度

flags:接收属性默认为0

返回值:

成功返回实际接收字节数

失败返回-1

连接断开返回0

5.bind

int bind(int sockfd, const struct sockaddr *addr,

socklen_t addrlen);

6.listen

int listen(int sockfd, int backlog);

功能:

监听三次握手链接请求

参数:

sockfd:套接字文件描述符

backlog:最多允许等待尚未处理的三次握手链接个数

返回值:

成功返回0

失败返回-1

10.accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

功能:

处理三次握手等待队列中的第一个请求并建立一个用来通信的新套接字

参数:

sockfd:套接字文件描述符

addr:存放发送端IP地址空间首地址

addrlen:想要接收的IP地址的长度

返回值:

成功返回新文件描述符

失败返回-1

  1. TCP粘包问题

TCP协议是面向字节流的协议,接收方不知道消息的界限,不知道一次提取多少数据,这就造成了粘包问题。

粘包问题出现的原因:

  1. 发送端:需要等缓冲区满时才发送出去,造成粘包;

  2. 接收端:不及时的接收缓冲区内的包,造成多个包接收。

避免粘包问题的方法:

  1. 对于定长的包,保证每次都按固定大小读取即可;// 结构体

  2. 对于变长的包,还可以在包和包之间使用明确的分隔符,这个分隔符是由程序员自己来定的,只要保证分隔符不和正文冲突即可。

  3. TCP报文头

标志位:

  1. URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。

  2. ACK: 确认应答标志

  3. PSH: 表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间

  4. RST: 重置连接标志

  5. SYN: 表示请求建立一个连接

  6. FIN: finish标志, 表示释放连接

滑动窗口大小:是TCP流量控制得一个手段。目的是告诉对方, 本端得TCP接受缓冲区还能容纳多少字节得数据,

这样对方就可以控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535.

  1. TCP的机制:

TCP复杂是因为它既要保证可靠性,同时又要尽可能的提高性能。

可靠性:

(1)三次握手和四次挥手机制

(2) 确认应答:TCP将每个字节的数据都进行了编号,即为序列号。每一个ACK都带有对应的确认序列号,保证数据不丢失的按序到达

(3)超时重传:当发送端发送的数据在网络中丢失时,在一定时间内没有收到接收端的ACK,则发送端会重新发送丢失数据。

(4)流量控制:按照ACK中"窗口大小"字段控制发送端的发送速度

提高性能:

(1)滑动窗口:可以按照"窗口大小", 一次发送多条后, 再等待应答。

(2)延迟应答:当接收方处理速度很快时,可以延迟发送ACK,此时"窗口大小"会自动增大

(3)捎带应答:搭载应用层的响应报文发送ACK。

=======================================================================

相关推荐
BB_CC_DD12 分钟前
Linux截图工具(ubuntu18.04+flameshot(火焰截图))
linux
云泽8081 小时前
不止是命令:Linux 高频指令实战 + 芯片架构底层逻辑
linux·运维·服务器
j_xxx404_1 小时前
Linux:基础IO
linux·运维·服务器
以太浮标1 小时前
华为eNSP模拟器综合实验之- VLAN终结实践案例分析
网络·计算机网络·华为·智能路由器
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][i2c]i2c-dev
linux·笔记·学习
Trouvaille ~3 小时前
【Linux】网络编程基础(二):数据封装与网络传输流程
linux·运维·服务器·网络·c++·tcp/ip·通信
柱子jason4 小时前
使用IOT-Tree Server模拟Modbus设备对接西门子PLC S7-200
网络·物联网·自动化·modbus·西门子plc·iot-tree·协议转换
万邦科技Lafite4 小时前
一键获取京东商品评论信息,item_reviewAPI接口指南
java·服务器·数据库·开放api·淘宝开放平台·京东开放平台
旅途中的宽~4 小时前
【深度学习】通过nohup后台运行训练命令后,如何通过日志文件反向查找并终止进程?
linux·深度学习
dump linux5 小时前
内核驱动调试接口与使用方法入门
linux·驱动开发·嵌入式硬件