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。

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

相关推荐
Wy_编程6 小时前
Linux-文本搜索工具grep
linux·运维·服务器
qq998996 小时前
AAA服务器技术
运维·服务器
xujiangyan_6 小时前
linux的sysctl系统以及systemd系统。
linux·服务器·网络
Lovyk6 小时前
Linux Shell 常用操作与脚本示例详解
linux·运维·服务器
iCan_qi7 小时前
【Mac】【Minecraft】关于如何在Mac上搭建基岩版MC服务器的方法
运维·服务器·macos·minecraft
xixingzhe210 小时前
多人同时导出 Excel 导致内存溢出
服务器·设计
吱吱企业安全通讯软件10 小时前
吱吱企业通讯软件保证内部通讯安全,搭建数字安全体系
大数据·网络·人工智能·安全·信息与通信·吱吱办公通讯
云手机掌柜10 小时前
Tumblr长文运营:亚矩阵云手机助力多账号轮询与关键词布局系统
大数据·服务器·tcp/ip·矩阵·流量运营·虚幻·云手机
yuanpan10 小时前
ubuntu系统上的conda虚拟环境导出方便下次安装
linux·ubuntu·conda
云边云科技11 小时前
零售行业新店网络零接触部署场景下,如何选择SDWAN
运维·服务器·网络·人工智能·安全·边缘计算·零售