摘要: 概述 在FIN_WAIT_2收到对端发来的FIN,并回复ACK之后,会进入TIME_WAIT状态,此时添加定时器,定时器超时会将tw控制块从ehash和bhash中删除,并且释放tw控制块; 启动定时器 TIME_WAIT定时器主要通过inet_twsk_schedule函数进行启动; tcp_rc 阅读全文
posted @ 2019-10-27 22:20 AlexAlex 阅读(639) 评论(0) 推荐(0) 编辑
摘要: 当TCP主动关闭一端调用了close()来执行连接的完全关闭时会执行以下流程,本端发送FIN给对端,对端回复ACK,本端进入FIN_WAIT_2状态,此时只有对端发送了FIN,本端才会进入TIME_WAIT状态,为了防止对端不发送关闭连接的FIN包给本端,将会在进入FIN_WAIT_2状态时,设置一 阅读全文
posted @ 2019-10-27 22:19 AlexAlex 阅读(937) 评论(0) 推荐(0) 编辑
摘要: 在用户进程启用了保活定时器的情况下,如果连接超过空闲时间没有数据交互,则保活定时器超时,向对端发送保活探测包,若(1)收到回复则说明对端工作正常,重置定时器等下下次达到空闲时间;(2) 收到其他回复,则确定对端已重启,关闭连接;(3) 超过探测次数仍未得到回复,则认为对端主机已经崩溃,关闭连接; 启 阅读全文
posted @ 2019-10-27 22:18 AlexAlex 阅读(721) 评论(0) 推荐(0) 编辑
摘要: 坚持定时器在接收方通告接收窗口为0,阻止发送端继续发送数据时设定。 由于连接接收端的发送窗口通告不可靠(只有数据才会确认,ACK不会确认),如果一个确认丢失了,双方就有可能因为等待对方而使连接终止:接收放等待接收数据(因为它已经向发送方通过了一个非0窗口),而发送方在等待允许它继续发送数据的窗口更新 阅读全文
posted @ 2019-10-27 22:17 AlexAlex 阅读(988) 评论(0) 推荐(0) 编辑
摘要: TCP在收到数据段但是无需马上确认时设定,如果在超时时间之内有数据要发送到对端,则确认会随着数据一起发送,即捎带ACK,如果达到超时时间则执行定时器回调立即发送ack; 启动定时器: 延迟确认定时器调用inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, xx, 阅读全文
posted @ 2019-10-27 22:15 AlexAlex 阅读(886) 评论(0) 推荐(0) 编辑
摘要: 注:这部分还没有完全分析透彻,先在此记录,后面回顾的时候再进行补充; 启动定时器: (1) 之前发送的数据段已经得到确认,新发出一个数据段之后设定; (2) 新建连接发送syn之后设定; (3) PMTU探测失败之后设定; (4) 接收方丢弃SACK部分接收的段时设定; 定时器回调函数: 重传定时器 阅读全文
posted @ 2019-10-27 22:14 AlexAlex 阅读(1481) 评论(0) 推荐(0) 编辑
摘要: 当服务器收到新的syn请求,会回复syn+ack给请求端,若某时间内未收到请求端回复的ack,新建连接定时器超时执行回调,重传syn+ack,当超时超过固定次数时,该连接中止;本文主要分析其初始化流程,具体的建立连接和超时重传流程在后续的文章中进行详细讨论; request_sock结构中的rsk_ 阅读全文
posted @ 2019-10-27 22:12 AlexAlex 阅读(752) 评论(0) 推荐(0) 编辑
摘要: 创建socket时会创建传输控制块,之后调用初始化函数对控制块进行初始化,其中包括对定时器的初始化,tcp会调用tcp_init_xmit_timers函数来初始化这些定时器,本文将详细分析tcp_init_xmit_timers函数; 下面为这种情况的函数调用关系: 1 /** 2 * inet_ 阅读全文
posted @ 2019-10-27 22:10 AlexAlex 阅读(623) 评论(0) 推荐(0) 编辑
摘要: TCP首部图 TCP首部说明 源端口,目的端口 用于寻找发送端和接收端应用进程。(源IP,源端口,目的IP,目的端口) 四元组确定唯一一个TCP连接;(IP,端口)也称为一个插口(socket); 序号 标识从TCP发送端向TCP接收端发送的数据字节流,它标识在当前传输报文段中的第一个数据字节;需要 阅读全文
posted @ 2019-10-27 22:08 AlexAlex 阅读(1376) 评论(0) 推荐(0) 编辑
摘要: 前提: A:主动关闭; B:被动关闭; A执行主动关闭,发送FIN,B收到FIN,发送ACK,进入CLOSE_WAIT,B发送FIN,进入LAST_ACK等待最后一个ACK到来; 关闭方式: (1) 收到A发送回来的ACK进入CLOSED状态; (2) 未收到A发送回来的ACK,重传FIN,此时A处 阅读全文
posted @ 2019-10-27 22:06 AlexAlex 阅读(6141) 评论(0) 推荐(0) 编辑
摘要: 传输控制块是一个分层的填充结构,每一个层次都增加一些字段,来表示一个通用的控制,它们都是结构中的第一个结构,可以直接从头部直接转换成对应的控制块;如:tcp控制块的tcp_sock的使用slab分配,其大小为整个tcp_sock结构的大小,在下层用不到上层tcp相关属性的时候,只取其中的某个部分即可 阅读全文
posted @ 2019-10-27 22:05 AlexAlex 阅读(533) 评论(0) 推荐(0) 编辑
摘要: getsockname-获取本地地址;比如,在绑定的时候设置端口号为0由系统自动选择端口绑定,或者使用了INADDR_ANY通配所有地址的情况下,后面需要用到具体的地址和端口,就可以用getsockname获取地址信息; getpeername-获取建立连接的对端的地址和端口; 下面为源码分析: 1 阅读全文
posted @ 2019-10-27 22:04 AlexAlex 阅读(1118) 评论(0) 推荐(0) 编辑
摘要: 函数原型 read/write系原型 1 #include <unistd.h> 2 3 ssize_t read(int fd, void *buf, size_t count); 1 #include <unistd.h> 2 3 ssize_t write(int fd, const void 阅读全文
posted @ 2019-10-27 22:03 AlexAlex 阅读(1136) 评论(0) 推荐(0) 编辑
摘要: recvmsg系统调用允许用户指定msghdr结构来接收数据,可以将数据接收到多个缓冲区中,并且可以接收控制信息;接收信息过程与其他接收系统调用核心一致,都是调用传输层的接收函数进行数据接收; 1 SYSCALL_DEFINE3(recvmsg, int, fd, struct user_msghd 阅读全文
posted @ 2019-10-27 21:57 AlexAlex 阅读(3063) 评论(0) 推荐(0) 编辑
摘要: recv系统调用对sys_recvfrom进行了简单的封装,只是其中不包含地址信息,其只需要从建立连接的另一端接收信息; 1 /* 2 * Receive a datagram from a socket. 3 */ 4 5 SYSCALL_DEFINE4(recv, int, fd, void _ 阅读全文
posted @ 2019-10-27 21:56 AlexAlex 阅读(666) 评论(0) 推荐(1) 编辑
摘要: recvfrom系统调用通过用户传入的接收空间构造msghdr,并且调用sock_recvmsg,该函数调用socket操作的recvmsg函数sock->ops->recvmsg,ipv4对应的是inet_recvmsg,该函数调用传输层的sk->sk_prot->recvmsg来接收数据,如tc 阅读全文
posted @ 2019-10-27 21:55 AlexAlex 阅读(1207) 评论(0) 推荐(0) 编辑
摘要: sendmsg系统调用允许在用户空间构造消息头和控制信息,用此函数可以发送多个数据缓冲区的数据,并支持控制信息;当调用进入内核后,会将用户端的user_msghdr对应拷贝到内核的msghdr中,然后进行数据发送; 1 SYSCALL_DEFINE3(sendmsg, int, fd, struct 阅读全文
posted @ 2019-10-27 21:54 AlexAlex 阅读(3185) 评论(0) 推荐(0) 编辑
摘要: send系统调用只是对sendto系统调用进行了封装,传递的参数不包含目的地址信息,数据会发送到已经建立连接的另一端的地址; 1 /* 2 * Send a datagram down a socket. 3 */ 4 5 SYSCALL_DEFINE4(send, int, fd, void __ 阅读全文
posted @ 2019-10-27 21:52 AlexAlex 阅读(598) 评论(0) 推荐(0) 编辑
摘要: sendto系统调用用于向指定的目的地址发送数据,其系统调用的流程比较容易理解,如下面所示,其主要完成 (1)将用户数据组织成msghdr,(2)而后调用socket操作的sendmsg;ipv4对应的sendmsg实现为inet_sendmsg,该函数进行端口自动绑定检查和绑定后,调用传输层的se 阅读全文
posted @ 2019-10-27 21:51 AlexAlex 阅读(1394) 评论(0) 推荐(1) 编辑
摘要: 用户端在使用sendmsg/recvmsg发送或者接收数据时,会使用msghdr来构造消息,其对应的内核结构为user_msghdr;其中msg_iov向量指向了多个数据区,msg_iovlen标识了数据区个数;在通过系统调用进入内核后,该结构中的信息会拷贝给内核的msghdr结构; 1 /* 用户 阅读全文
posted @ 2019-10-27 21:50 AlexAlex 阅读(5638) 评论(0) 推荐(0) 编辑