TCP 常用总结

SO_RCVBUF SO_SNDBUF

TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,不管进程是否读取socket,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲区之中.

read所做的工作,就是把内核缓冲区中的数据拷贝到应用层用户的buffer里面,仅此而已.

send所做的工作,最简单情况(也是一般情况),将数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回.

send返回之时,数据不一定会发送到对端,send仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中.

UDP socket都有一个接收缓冲区,没有发送缓冲区,UDP不保证数据一定发送成功,所以只要有数据就发,不管对方是否可以正确接收,所以不缓冲,不需要发送缓冲区.

接收缓冲区被TCP和UDP用来缓存网络上来的数据,一直保存到应用进程读走为止.对于TCP,如果应用进程一直没有读取,buffer满了之后,发生的动作是:通知对端TCP协议中的窗口关闭.这个便是滑动窗口的实现.

保证TCP套接口接收缓冲区不会溢出,从而保证了TCP是可靠传输.因为对方不允许发出超过所通告窗口大小的数据. 这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它.

UDP:当套接口接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃.UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的UDP丢弃数据报.

SO_RCVLOWAT SO_SNDLOWAT

每个套接口都有一个接收低水位和一个发送低水位.

接收低水位:对于TCP套接口而言,接收缓冲区中的数据必须达到规定数量,内核才通知进程“可读”.比如触发select或者epoll,返回“套接口可读”.

发送低水位:对于TCP套接口而言,和接收低水位一个道理.

理解接收低水位:如果应用程序没有调用recv()去读取socket的接受缓冲区的数据,则接受缓冲区数据将注一直保存在接受缓冲区中,所以随着接受缓冲区接受到更多发送端发送缓冲区中的数据,则肯定会导致接受缓冲区溢出,所以设置一个接受低水位,当epoll监听到某一个socket的接受缓冲区的数据超过了接受低水位,则触发读就绪,使得epoll循环返回,开始处理读I/O事件.

接收低水位: 默认为1字节

理解发送低水位:如果应用程序没有调用send()来copy应用程序buff中的数据到socket发送缓冲区中,则随着发送缓冲区的数据被内核通过tcp协议发送出去,最后socket发送缓冲区的数据越来越少,可用的剩余空间越来越多,最后超过发送缓冲区的发送低水位,则epoll监听到这个socket可写,使得epoll循环返回,开始处理写I/O事件.

发送低水位 : 默认为2048字节

SO_REUSEADDR

这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用端口.如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已经使用中".如果服务程序停止后想立即重启,而新套接字依旧使用同一端口,此时SO_REUSEADDR 选项非常有用.必须意识到,此时任何非期望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不可能.

一个套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端口.SO_REUSEADDR 仅仅表示可以重用本地本地地址、本地端口,整个相关五元组还是唯一确定的.所以,重启后的服务程序有可能收到非期望数据.必须慎重使用 SO_REUSEADDR 选项.

SO_REUSEPORT

https://my.oschina.net/miffa/blog/390931

SO_LINGER

此选项指定函数close对面向连接的协议如何操作(如TCP).内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方.

时间: 2024-10-13 12:34:38

TCP 常用总结的相关文章

TCP常用网络和木马使用端口对照表

[开始-运行- CMD , 输入 netstat -an 然后回车就可以查看端口] 端口:0 服务:Reserved 说明:通常用于分析操作系统.这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果.一种典型的扫描,使用IP地址为0.0.0.0,设置ACK位并在以太网层广播. 端口:1 服务:tcpmux 说明:这显示有人在寻找SGI Irix机器.Irix是实现tcpmux的主要提供者,默认情况下tcpmux在这种系统中被打开.Irix机器在发

传输层 TCP UDP

传输层 TCP UDP TCP:ip提供点到点的连接,通过ip可以找到目标主机,TCP 传输控制协议 提供可靠的面向连接的端到端的协议(确认端口.提供服务类型)(传输效率低) DUP:用户数据报协议,不可靠的 非面向连接的协议.(传输效率高) TCP封装格式 4.TCP的三次握手=建立连接. 四次断开 =结束通信发送完成之后断开连接=四次断开TCP计时器: 重传计时器--为了控制丢失的数据段 坚持计时器--为了防止零窗口死锁(信息不对成,双方都在等待) 保活计时器--防止两个TCP连接长时间的空

Linux 网络 tcp C/S通信模型

C/S模型就是server 与 client 的模型 TCP服务器模型流程图                                                               TCP 客户端模型流程图:                    函数使用: (1)创建一个网络通信套接字描述符  int socket(int domain, int type, int protocol); 参数:domain : 协议系列,常用的是 AF_INET 表示IPV4     ty

深入理解TCP协议及其源代码-send和recv背后数据的收发过程

send和recv背后数据的收发过程 send和recv是TCP常用的发送数据和接受数据函数,这两个函数具体在linux内核的代码实现上是如何实现的呢? ssize_t recv(int sockfd, void buf, size_t len, int flags) ssize_t send(int sockfd, const void buf, size_t len, int flags) 理论分析 对于send函数,比较容易理解,捋一下计算机网络的知识,可以大概的到实现的方法,首先TCP是

UDP-TCP

一.网络相关基本概念     1.网络通信协议:是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络引提供通信支持,是一种网络通用语言.通信协议的具体种类有很多,主要有:UDP协议和T    CP协议     2.UDP 协议:是 User Datagram Protocol 的简称, 中文名是'用户数据报协议'.是一种无连接的协议.传输效率很高;数据不安全,容易丢失;             特点:             1:面向无连接;             2:效率高; 

网络编程socket模块

套接字的地址家族(AF, Address Family)分为2种,一种是基于文件的AF_UNIX,一种是基于网络的AF_INET,:套接字的类型有2种,面向连接的套接字SOCK_STREAM和无连接的套接字SOCK_DGRAM. UDP常用的模块有3个: (1) socket([family[, type[proto]]]) (2) sendto(string,address) (3) recvfrom(bufsize[, flags]) 收发UDP数据,接收到的是data,address TC

Atitit 编程语言知识点tech tree v2 attilax大总结

大分类中分类小分类知识点原理与规范具体实现(javac#里面的实现phpjsdsl(自己实现其他语言实现 类与对象实现对象实现 类与对象实现class模板 类与对象实现方法重载 类与对象实现dock type 类与对象实现基于原型 类与对象实现封装 类与对象实现多态 类与对象实现继承 类与对象实现多继承 类与对象实现动态对象 类与对象实现类加载classloader 类与对象实现程序集加载自动语句加载 类与对象实现程序集加载反射api加载 类与对象实现程序集加载字节数组加载 类与对象实现程序集加

Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结

分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据库理论,网状,层次, 数据库理论树形数据库注册表,hashtable 数据库理论,kv数据库.hashtable 数据库理论Oodb 数据库理论nosql db 数据库理论隔离级别 数据库理论 数据库理论Er模型 数据库理论Acid数据库完整性 数据库理论关系模型 数据库理论   sql 数据库理论 数据库理论存储过程 数据库理论 触发器 数据库理论 视图 约束 数据库理论 数据

Ubuntu Commands 2

lsof  lsof,它对应于“list open files”(列出打开的文件) fuser  fuser 命令列示了本地进程的进程号,那些本地进程使用 File 参数指定的本地或远程文件.对于阻塞特别设备,此命令列示了使用该设备上任何文件的进程. 使用端口号查看进程: sudo lsof -i :80 | grep LISTEN # 查看端口80的占用进程 sudo netstat -nlp | grep :80 # 另一种方式 根据端口号kill该占用tcp的进程: sudo fuser