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。

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

相关推荐
哼?~3 小时前
NAT、代理服务、内网穿透
网络
茉莉玫瑰花茶3 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
kidwjb4 小时前
信号量在进程中的使用
linux·进程间通信
上海云盾-小余5 小时前
内网边界安全管控:访问权限隔离与入侵阻断方案
网络·安全·web安全
南京码讯光电技术有限公司6 小时前
工业无线AP选型指南:从WiFi 5到WiFi 6+5G CPE,如何构建全覆盖、零漫游、高可靠的智能工厂网络?
服务器·网络·5g
sulikey6 小时前
个人Linux操作系统学习笔记2 - gcc与库的理解
linux·笔记·学习·操作系统·gcc·
二宝哥6 小时前
Linux虚拟机网络配置
linux·运维·服务器
陳10307 小时前
Linux:进程间通信 和 简单进程池
linux·运维·服务器
优橙教育7 小时前
5G网络优化关键参数解读:从入门到实战
网络·学习·5g
jimy17 小时前
改.bashrc,直观地判断本地repo是否有改动
linux·服务器