TCP 简单记录

TCP

定义

TCP 是面向连接的协议,可靠地,基于字节流的传输层通信协议
可靠性: 滑动窗口协议,定时器

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值