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。

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

相关推荐
中科岩创1 分钟前
中科岩创桥梁自动化监测解决方案
大数据·网络·物联网
我曾经是个程序员6 分钟前
C#Directory类文件夹基本操作大全
服务器·开发语言·c#
花姐夫Jun1 小时前
在 CentOS 8 系统上安装 Jenkins 的全过程
linux·centos·jenkins
地球资源数据云1 小时前
全国30米分辨率逐年植被覆盖度(FVC)数据集
大数据·运维·服务器·数据库·均值算法
是店小二呀1 小时前
【Linux】Linux开发利器:make与Makefile自动化构建详解
linux·运维·自动化
‘’林花谢了春红‘’2 小时前
计算机网络习题(第5章 网络层 第6章 传输层)
网络·计算机网络
哎呦不错哦.2 小时前
简单园区网拓扑实验
网络·智能路由器
BUG 4042 小时前
LINUX--shell
linux·运维·服务器
菜鸟小白:长岛icetea2 小时前
Linux零基础速成篇一(理论+实操)
linux·运维·服务器
深海的鲸同学 luvi2 小时前
【HarmonyOS NEXT】hdc环境变量配置
linux·windows·harmonyos