TCP
定义
TCP 是面向连接的协议,可靠地,基于字节流的传输层通信协议
可靠性: 滑动窗口协议,定时器
TCP流程
三路握手&四路结束
数据流交互nagle
nagle为了避免发送过多的小数据块,发送数据时如果数据的的大小没有达到MSS,并且连接上有数据还没有ACK,则不允许此次发送。或者数据包在本地等待超过200ms时仍然没有达到MSS则立即发送,可以理解为用时间换空间的一种做法
数据块交互滑动窗口
滑动窗口是TCP接收消息的缓冲区,用于避免消息。
a->b发送数据:消息中携带期待收到消息的id,当前窗口大小。如果接收方的窗口为0, 发送方则暂停发送。这样会导致发送方始终不能发送数据,为了解决这个问题发送方需要一个定时器,出现这种情况时定时发送消息探测接收方的窗口大小
定时器
TCP有四个定时器:
- 重传定时器 控制重传
- 坚持定时器 : 在接收方窗口打满时启动?避免 窗口糊涂
- 保活定时器: 探测连接是否依然有效
- 2MSL定时器: 避免最后一个fin包延时到达,导致新建立的连接被立即关闭
编程
server新建一个tcp服务器
#include <sys/types.h>
#include <sys/socket.h>
int main() {
int fd = socket(AF_INET, SOCK_STREAM,);
struct sockadd_in ;
if (fd == -1) {
printf("create socket error");
return 0;
}
bind(fd,&sockadd, sizeof(sockaddr));
listen(fd, 5);
while (accept(fd, &sockaddr, sizeof(sockaddr) != -1) {
do_something();
}
}
SIGPIPE
对于一个已经失效的连接写入时会接收到rst的ack,再次写入时会接收到SIGPIPE,忽略这个信号或者打一个日志即可
signal(SIGPIPE, SIG_IGN)
TCP选项
- TCP_NODELAY
关闭nagle算法,使消息立即发送对于有严格延时要求的系统需要开启这个选项
int optval = on ? 1 : 0;
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &optval, static_cast(sizeof optval)); - TCP_CORK
加强版的nagle 算法, 在发送数据大小没有打刀MTU或者定时器没到之前不会发送,无论连接上是否有ACK.