tcp - 传输控制协议 (TCP)
总缆 SYNOPSIS
#include <sys/socket.h>
#include
<netinet/in.h>
tcp_socket = socket(PF_INET, SOCK_STREAM,
0);
描述 DESCRIPTION
本协议是对 RFC973, RFC1122 和 RFC2001 定义的协议及其 NewReno 和 SACK
扩充部份实现的。它在建立在互联网协议 ip(7) 之上的两个套接字之间提供了可靠的面向数据流的全双工连接。 TCP
协议确保了数据按序到达并在数据包丢失时自动重发。它产生和校验每个数据包的校验和 (checksum) 用以捕捉数据传输时错误。TCP 不保留记录的上下限。
初始的 TCP 接口不包含远端或本地址并且没有规定明确。在产生一个出站 (outgoing) TCP 连接时使用
connect(2) 来与另个套接字建立一个网络接口。在接收一个入站 (incoming) 连接时,套接字使用
bind(2) 先取得本地地址和端口,然后调用 listen(2) 使套接字进入侦听状态。随后可以用
accept(2). 接受为每一个入站 (incoming) 连接建立的新套接字。一个已经经过 accept 或
connect 成功调用的套接字表示它已完全明确,可以进行数据传送。在侦听状态或尚未建立连接的网络接口之间数据传送将不能进行。
Linux 2.2 支持 RFC1323 TCP 高性能扩展。这包括采用大 TCP
数据滑移窗以支持高延时或高带宽下的多连接。为实现这些功能,必须增加接收与发送的数据缓存区。它们可以使用 net.core.wmem_default
和 net.core.rmem_default sysctl 进行全局设定,或用 SO_SNDBUF 和 SO_RCVBUF
套接字选项对套接字进行单独设定。套接字缓存区的最大尺寸,受到由全局变量 net.core.rmem_max 和
net.core.wmem_max 两个 sysctl 限制。详细细节,请参见 socket(7).
TCP 支持紧急数据。紧急数据用来通知接收方,在数据流中有需要尽快处理的重要信息。发送紧急数据,需在 send(2). 中指定
MSG_OOB 选项。当紧急数据接收后,内核发送 SIGURG 信号到读进程或者那些用 ioctl 设置了
FIOCSPGRP 或 FIOCSETOWN 套接字的进程或进程组.当打开了 SO_OOBINLINE 套接字选项,
那么紧急数据被放入普通数据流中。 (可以用 SIOCATMARK ioctl 来测试), 否则只有设置了
sendmsg(2) 中的 MSG_OOB 标志时,数据才能被接收。
地址格式 ADDRESS FORMATS
TCP 是建立在 IP 之上(参见 ip(7)).
ip(7) 定义定义的地址格式也适用于 TCP. TCP只支持点对点通讯,不支持全局及多址广播。
系统控制 SYSCTLS
可以通过访问 /proc/sys/net/ipv4/* 目录下的文件或通过
sysctl(2) 接口进行访问这些 sysctl. 此外大多数 IP sysctl 也同样适用于 TCP; 参见
ip(7).
- tcp_window_scaling
- 打开 RFC1323 协议中 TCP 滑移数据窗尺寸调整.
- tcp_sack
- 打开 RFC2018 协议中 TCP 选择性确认.
- tcp_timestamps
- 打开 RFC1323 协议中 TCP 时间戳.
- tcp_fin_timeout
- 规定强迫关闭套接字前,等待最后结束数据包的秒数。这确实与 TCP 协议中有关规定相违背。但这是防止拒绝服务攻击所要求的。
- tcp_keepalive_probes
- 丢弃数据包前,进行最大 TCP 保持连接侦测. 保持连接仅在 SO_KEEPALIVE 套接字选项被打开时才被发送.
- tcp_keepalive_time
- 从不再传送数据到向连接上发送保持连接信号之间所需的秒数,默认为 10800 秒(3 小时)。
- tcp_max_ka_probes
- 在一定时间发送保持连接时间侦测包的数量。为防止突发信号,此值不宜设置太高。
- tcp_stdurg
- 使 TCP 紧急指针字段遵循在 RFC973 协议中的严格解释。缺省情况下,紧急指针字段使用与 BSD 相兼容,指针指向紧急数据后的第一个字节。在
RFC973 协议中是指向紧急数据后的最后一个字节。打开这一选项可能造成操作互换性问题。 - tcp_syncookies
- 打开 TCP 同步标签(syncookie),内核必须打开了 CONFIG_SYN_COOKIES 项进行编译.
同步标签(Syncookie)防止一个套接字在有过多试图连接到达时的过载。当使用同步标签(syncookie)时,客户机可能探测不到一个超时时间短的过载主机。 - tcp_max_syn_backlog
- 每个接口中待发数据队列 (backlog) 长度。Linux 2.2 中,在 listen(2)
中的定义只说明了已建立的套接字中待发数据队列(backlog)长度。每个侦测套接字的还未建立的套接字(在 SYN_RECV
状态中的)的最大队列长度用这个 sysctl 设置。当更多的连接请求到达时,Linux
系统将开始丢弃数据包。当同步标签(syncookie)被设置成打开,数据包仍能被回应时,这个值将被忽略。 - tcp_retries1
- 定义放弃回应一个 TCP 连接请求前发送重试信号的次数。
- tcp_retries2
- 定义放弃在已建立通讯状态下一个 TCP 数据包前重发的次数。
- tcp_syn_retries
- 定义在放弃发送初始同步数据包(SYN
packet)到远端主机前重试的次数并返回出错消息,此值必须小于255。这仅对出站(outgoing)连接超时有效;对于进站(incoming)连接重发数由
tcp_retries1 定义。 - tcp_retrans_collapse
- 在重发时试图发送全尺寸数据包。用来解决一些堆栈中的 TCP 缺陷(BUG)。
接口选项 SOCKET OPTIONS
设置或取得 TCP 接口选项,调用 getsockopt(2) 进行读操作或调用
setsockopt(2) 将接口系列选项参数传送到 SOL_TCP 中去.另外,大多数 SOL_IP
接口选项对 TCP 接口也适用。更多资料,请参见 ip(7).
- TCP_NODELAY
- 关闭 Nagle 算法。这意味着数据包将尽可能快地被发送而没有因有网络中更多的数据包造成的延时,期待一个整数表示的布尔标志。
- TCP_MAXSEG
- 设置或接收最大出站 TCP 数据段尺寸。如果这个选项在建立连接前的设置,它将改变发送到另一端初始信息包中的 MSS 值。这个值大于 MTU
接口值将被忽略而不起作用。 - TCP_CORK
- 设置此项将不发送部份帧。所有排队的部份帧只在此项清除后,才能发送。在调用 sendfile(2)
前准备数据报头或对网络吞吐量进行优化有用处。此选项不能与 TCP_NODELAY 联用.
输入输出控制字 IOCTLS
这些 ioctl 可以用 ioctl(2) 进行访问。正确调用句法为:
-
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
- FIONREAD
- 返回接收缓存中排队的未读数据的数量。变量参数是指向一个整数的指针。
- SIOCATMARK
- 如果用户程序已经接收了所有紧急数据,此项返回值为 0。它与 SO_OOBINLINE 联用。变量参数是对测试结果,指向一个整数的指针。
- TIOCOUTQ
- 返回在接口(socket)发送队列中待发送数据数,该指针返回是一个整数数值。
出错处理 ERROR HANDLING
当网络发生错误时,TCP 协议将尝试重新发送数据包,当重发一定失败次数后,产生超时错 ETIMEDOUT 或报告在此连接上最后出错消息。
有时程序需要更快地侦测到出错状态。这可以通过打开 SOL_IP 级别的 IP_RECVERR 接口选项。当此项打开后,所有入站 (incoming) 错误被立即送到用户程序中。小心使用该选项-它使 TCP 协议对路由的改变和其他正常网络状态变化的容错性下降。
附注 NOTES
当建立一个连接时发生错误引发一个对 SIGPIPE 接口写操作,此操作仅当 SO_KEEPOPEN 接口选项被设置时才能进行。
TCP 并不具有真正的额外频带(out-of-band)数据; 虽然它可以有紧急数据。在 Linux 中这意味着如果有其他端发送紧急数据时,旧的紧急数据将被当作普通数据插入数据流中。(即使 SO_OOBINLINE 值没有被设置).这与基于 BSD 堆栈定义不同.
缺省状态下,Linux 使用与 BSD 兼容的紧急数据指针字段。这与 RFC1122 协议相违背, 但这是与其他堆栈协议相互操作性所要求。它可以用 tcp_stdurg sysctl 加以改变.
已知错误 ERRORS
- EPIPE
- 另一端意外关闭了套接字连接或对一个关闭了的套接字进行读操作。
- ETIMEDOUT
- 一段时间后,另一端不确认重发数据。
- EAFNOTSUPPORT
- 在 sin_family 传递套接字地址类型而不是在 AF_INET中的。
任何定义为 ip(7) 出错或普通套接字出错可能返回为 TCP 出错.
tcp - 传输控制协议 (TCP)的更多相关文章
- 【RL-TCPnet网络教程】第12章 TCP传输控制协议基础知识
第12章 TCP传输控制协议基础知识 本章节为大家讲解TCP(Transmission Control Protocol,传输控制协议),通过本章节的学习,需要大家对TCP有个基本的认识,方 ...
- TCP 传输控制协议(转)
开头先说几个协议: IP:网际协议 TCP:传输控制协议 Http:超文本传输协议 AMQP:高级消息队列协议 一:TCP是什么? TCP(Transmission Control Protocol ...
- TCP/IP学习笔记:TCP传输控制协议(一)
1 TCP的服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向用户提供一种面向连接的,可靠地字节流服务.两个使用TCP的应用,在彼此交换数据之前必须先建立一个TCP连接,在一个TCP连接中 ...
- 读书笔记 --TCP :传输控制协议(二)
TCP建立连接 请求端(客户端)发送一个SYN指明客户端打算连接的服务器端口号,以及初始序列号. 服务端发回包含服务器的初始序号的SYN报文段作为应答.同时,将确认序号设置为客户的ISN加1以对客户的 ...
- 读书笔记 --TCP :传输控制协议(一)
TCP提供一种面向连接的,可靠的字节流服务. TCP 通过如下方式来提供可靠性: 应用数据被分割成TCP认为最适合发送的数据块. 超时重传机制.TCP发出一个段后,启动一个定时器,等待目的端确认收到这 ...
- 网络协议抓包分析——TCP传输控制协议(连接建立、释放)
前言 TCP协议为数据提供可靠的端到端的传输,处理数据的顺序和错误恢复,保证数据能够到达其应到达的地方.TCP协议是面向连接的,在两台主机使用TCP协议进行通信之前,会先建立一个TCP连接(三次握手) ...
- 10 TCP 传输控制协议 UDP区别
1.tcp和udp区别 2.TCP通信模型 生活中的电话机 如果想让别人能更够打通咱们的电话获取相应服务的话,需要做一下几件事情: 买个手机 插上手机卡 设计手机为正常接听状态(即能够响铃) 静静的等 ...
- TCP/IP详解 卷一(第十七章 TCP:传输控制协议)
与UDP协议相比,TCP提供一种面向连接的.可靠的字节流服务. TCP首部 跟UDP一样,TCP数据被封装在一个IP数据报中,下面显示TCP的首部数据格式 每个TCP段都包含源端和目的端的端口号,用于 ...
- [TCPIP] 传输控制协议 Note
TCPIP TCP 传输控制协议 TCP提供一种面向连接的,可靠的字节流服务. 面向连接意味着两个使用TCP的应用在传输数据之前先建立一个TCP连接,这个过程跟打电话相似.在一个TCP连接中仅有两方 ...
随机推荐
- Python3学习笔记(MOOC)
文本进度条实例 #!/usr/bin/env python3 import time #for i in range(101): # print ("\r{:3.0f}%".for ...
- LOGO有哪几种常规设计思路?
Logo设计的思路多种多样,但是我个人从Logo设计的历史上,大致可以归纳出五种常规思路,思路的名称是自己编的,仅供大家参考.而列举的这些思路背后,都是有着各自的时代背景的. 先从历史最悠久的一种设计 ...
- CentOS7.6系统安装详解(含真机装系统的采坑之旅)!
刚开始学习linux操作系统是总是很茫然,无所适从,以下是自己总结的工作经验,仅供参考! 一.准备资源 安装前需要准备的资源有linux系统centos7.6发行版系统镜像,vmware workst ...
- go语言从例子开始之Example19.接口
接口 是方法特征的命名集合. Example: package main import "fmt" //让方法,实现api这个接口. type api interface{ get ...
- tomcat manager详解
Tomcat Manager是Tomcat自带的.用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用.Tomcat是Java领域使用最广泛的服务器之一,因此Tomcat Mana ...
- 常用的kubectl命令
本文主要介绍kubernetes排查问题时经常用到的命令.这里主要借助kubectl命令来实现.以下列出常用命令,后面会对每个命令进行详细解释,并举例: kubectl核心命令 get 获取列出一个 ...
- python 常用技巧 — 字典 (dictionary)
目录: 1. python 相加字典所有的键值 (python sum all values in dictionary) 2. python 两个列表分别组成字典的键和值 (python two l ...
- 新建maven项目index.jsp文件报错处理
最近用eclipse新建了一个maven项目,结果刚新建完成index.jsp页面就报错了,先把错误信息贴出来看看 后来就找资料,结果发现两种解决办法,希望可以帮助用得上的人! 第一种:直接在pom. ...
- Steup Factory 操作注册表
//判断注册表是否存在,不存在就创建 result = Registry.DoesKeyExist(HKEY_CURRENT_USER, "SOFTWARE\\MyTestApp" ...
- 每天一个linux命令:cp(8)
cp cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时, ...