TCP协议详解
文章平均质量分 81
详细阐述TCP协议在Linux内核中的实现
Remy1119
专注于技术
展开
-
4.3 TCP Splice
分散-聚集IO是一种允许向skb的非连续空间(frag page)中写入数据,并利用网卡支持发送skb中非连续空间中的数据来实现减少数据copy次数,以提高数据发送效率的方法。sendfile系统调用就是利用这一功能来提升性能的。下面以sendfile系统调用为例说明分散-聚集IO功能的使用方法。 通常,发送一个文件中数据的流程是:(1)使用read系统调用读取file中的数据;这个过程原创 2015-03-24 22:08:09 · 2486 阅读 · 0 评论 -
4.2 TCP Segmentation Offload(TSO)
TSO (TCP Segmentation Offload) 是一种利用网卡替代CPU对大数据包进行分片,降低CPU负载的技术。如果数据包的类型只能是TCP,则被称之为TSO。此功能需要网卡提供支持。TSO 是使得网络协议栈能够将大块 buffer 推送至网卡,然后网卡执行分片工作,这样减轻了CPU的负荷,其本质实际是延缓分片。这种技术在Linux中被叫做GSO(Generic Segmentat原创 2015-03-23 20:53:41 · 12159 阅读 · 0 评论 -
4.1 发包系统调用
连接建立完成后,应用进程可以使用send、sendto、sendmsg、write、writev系统调用来发送TCP数据,其中sendmsg和writev可以发送位于多个不连续内存中的数据。使用这些函数发送数据时需指定socket文件描述符、要发送的数据所在的缓冲区首地址及数据长度等信息。上述发包系统调用对应的内核函数都会调用__sock_sendmsg_nosec函数。现在以send系统调用和w原创 2015-03-23 10:23:15 · 1627 阅读 · 0 评论 -
8.6 TCP Fast Open(TFO)
TFO(TCP Fast Open)是一种能够在TCP连接建立阶段传输数据的机制。使用这种机制可以将数据交互提前,降低应用层事务的延迟。其基本步骤如下:1、客户端发送一个SYN包到服务器,这个包中携带了Fast Open Cookie请求的TCP选项;2、服务器生成一个cookie,这个cookie是通过使用密钥加密客户端的IP地址生成的。服务器给客户端发送SYN|ACK响应,在响应包原创 2015-03-21 13:09:13 · 9490 阅读 · 0 评论 -
3.7 Accept系统调用
在完成三次握手后,server端TCP会创建一个sock结构来与client端的scoket进行一对一的数据传递。但这个sock进存在于内核中,server端用户进程还无法使用。进程要想使用这个新的连接,必须调用accept系统调用生成一个与sock关联的socket,然后进程通过对这个socket进行recv、send等操作来实现与client端的数据传递。连接建立完成后,服务器端的应用进程会从原创 2015-03-22 20:49:27 · 1265 阅读 · 3 评论 -
3.6 SYN Cookie
在三次握手过程中,server端的TCP收到SYN请求后会建立一个request_sock保存在syn_table中。如果有恶意攻击者大量发送IP地址或端口不同的SYN包,则server端TCP的syn_table很快会被占满,而普通用户对server的正常访问会因为syn_table已满而被拒绝。这就是SYN Flood攻击。SYN Cookie技术就是为了应对SYN Flood攻击而产生的,它原创 2015-03-19 21:45:07 · 2056 阅读 · 0 评论 -
3.4 同时打开
两个应用程序同时彼此执行connect系统调用向对方发送SYN请求,一方所使用的源|目的IP和源|目的端口恰好是对方的目的|源IP和目的|源端口,这就是“同时打开”。尽管这种情况很少见,但TCP是支持的。 这种场景下,应用进程先发送一个SYN,然后socket进入TCP_SYN_SENT状态,这时收到了对端的SYN,而非SYN|ACK。处理流程与3.3节中客户端处理SYN|ACK的相似:原创 2015-03-18 12:35:13 · 857 阅读 · 0 评论 -
3.3 连接建立完成
服务器发送的SYN|ACK抵达客户端的网卡、经过链路层、网络层的协议处理后,如果网络层协议为IPv4,则会进入到TCPv4的入口函数tcp_v4_rcv:1961 int tcp_v4_rcv(struct sk_buff *skb)1962 {1963 const struct iphdr *iph;1964 const struct tcphdr *th;1965原创 2015-03-18 09:30:10 · 2140 阅读 · 1 评论 -
3.2 SYN的接收与SYN|ACK的发送
客户端发送的SYN请求到达服务器的网卡后,进入服务器操作系统的网络协议栈,经过链路层和网络层的处理后,抵达TCP协议的入口函数。TCPv4的入口函数是tcp_v4_rcv,TCPv6的入口函数是tcp_v6_rcv。下面对tcp_v4_rcv进行分析: 1961 int tcp_v4_rcv(struct sk_buff *skb)1962 { 1963 const struc原创 2015-03-17 15:20:41 · 2306 阅读 · 0 评论 -
3.1 Connect系统调用
在server端完成listen系统调用之后,就处于可以接受请求的状态,这时client端就可以发送SYN请求给server从而开始“三次握手”。SYN请求的发送是通过connect系统调用实现的:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 其中,sockfd是使用socket系统调用创建的原创 2015-03-16 09:15:12 · 3050 阅读 · 1 评论 -
2.3 Listen系统调用
在C/S模式中,服务器进程必须调用bind系统调用,这样才能确定对外提供服务的地址;客户端进程可以调用bind,这是为了确定客户端在发送请求时使用的源IP地址和端口。而listen系统调用服务器进程必须调用,对于客户端进程而言此函数无用。listen系统调用究竟干了什么? listen系统调用的函数原型:int listen(int sockfd, int backlog); so原创 2015-03-15 22:24:00 · 1469 阅读 · 3 评论 -
2.2 Bind系统调用
Socket是用socket系统调用生成的,它指定了地址族(domain)但并没有地址与之关联。Bind系统调用会将一个地址与socket关联。其函数原型为:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);其中,sockfd为套接字的文件描述符,addr指向存放地址信息的结构体的首地址,addrle原创 2015-03-13 11:13:21 · 1693 阅读 · 0 评论 -
2.1 Socket系统调用
TCP是传输层协议,网络层使用IPv4或IPv6协议,即TCP报文作为IPv4或IPv6报文的数据部分。本文中将使用IPv4协议的TCP称为TCPv4,将使用IPv6的TCP称为TCPv6。使用不同的IP协议对于TCP的影响主要是连接查找、检验和计算等与IP地址相关的部分,核心功能并无差异。故此在以下的代码分析过程中会以TCPv4为主。 先来看看socket系统调用的函数原型:int原创 2015-03-12 14:07:42 · 3038 阅读 · 0 评论 -
1.3 C/S模式
TCP允许程序员在两个应用程序之间建立连接并来回传递数据,这种应用程序可以在同一台机器上,也可以在不同的机器上运行。TCP并没有规定应用程序在什么时间进行交互以及为什么要进行交互,也没有规定程序员如何组织这些应用程序。在实践中,有一种应用程序的组织方式在TCP的使用中占据着主要地位,就是C/S模式,即Client/Server模式。 Server端示例如下:fd = socket(A原创 2015-03-11 15:29:20 · 1311 阅读 · 4 评论 -
1.2 TCP首部格式
TCP是一个通信协议,所谓协议就是通信各方约定好的通信规则。大家必须全部严格遵守这些规则,通信才能顺利完成。TCP的通信规则由一系列RFC来规范。首先是首部格式。在Linux中对应的结构体为: include/uapi/linux/tcp.h 24 struct tcphdr { 25 __be16 source; 26 __be16 dest; 27原创 2015-03-11 13:15:23 · 1961 阅读 · 0 评论 -
1.1 TCP协议简介
提起网络协议栈,首屈一指的自然是TCP/IP协议栈.作为TCP/IP协议栈的核心协议之一,TCP早已成为网络应用程序开发者实现可靠数据传递的首选工具,HTTP, FTP, Telnet等协议都是基于TCP实现的.那么TCP有什么样的协议?它有哪些特点能赢得大家如此的青睐呢? TCP(Transmission Control Protocol)传输控制协议是一种面向连接的、可靠的、基于字节流的原创 2015-03-11 08:54:54 · 1784 阅读 · 0 评论 -
5.3 慢速路径处理
TCP报文段进入慢速处理的条件是:原创 2015-03-30 10:23:49 · 5062 阅读 · 0 评论 -
3.5 ICMP不可达报文的处理
在三次握手阶段有两种情况TCP会收到ICMP“目的不可达”报文:1、client端通过connect系统调用发送SYN请求到server端后,server没有进程在相应的地址或端口处理请求,这时client端会收到ICMP不可达报文2、client端通过connect系统调用发送SYN请求后崩溃,server端收到SYN后发送SYN|ACK,client端收到SYN|ACK后会给serve原创 2015-03-19 08:03:30 · 12100 阅读 · 0 评论 -
4.5 路径MTU发现
TCP报文需要封装成IP报文才会发送,报文在网络中按照一定路径传输后会抵达目的地。最理想的情况是IP报文的大小正好是这条路径所能容纳的最大尺寸,因为报文小了则数据传输效率不高,大了则会引起分片。分片会使得路由器的负担加重,增加延迟,而且会增加报文丢失的概率。而IP报文的传输路径是事先不知道的,而且在传输过程中也可能发送变化,所以TCP需要动态测路径MTU的大小,这就是路径MTU发现。原创 2015-03-25 22:33:15 · 10443 阅读 · 3 评论 -
TCP协议探秘
前言 研究TCP实现是为了更好地使用它。通过Unix的socket套接字接口,可以开发基于TCP的应用程序;了解TCP的实现可以更加明晰接口的行为,大大提高开发效率。使用Unix的socket套接字接口和系统提供的接口(sysctl,proc等)调整TCP相关参数,以控制TCP的行为,优化其性能;理解TCP的实现可以更加明确各个参数对TCP行为的影响,使得性能优化事半功倍。了解TCP协议原创 2015-03-10 21:43:44 · 3208 阅读 · 0 评论 -
11.1 I/O模型概览
在原创 2015-04-13 23:43:15 · 844 阅读 · 0 评论