tcp ip高效编程 笔记

栏目: 服务器 · 发布时间: 5年前

内容简介:套接字API与协议无关。domain是个常量,表示通信域,有以下两个type说明套接字的类型,有常见的以下几种

CS架构与对等实体

CS位置 备注 特点 举例
同一机器 数据会被环回,并不会放到网络设备输出队列中 几乎没有网络延迟和丢包 自己开发web程序调试
同一局域网内 极少没有网络延迟和丢包 打印机
不同网络 位于广域网 途径的路由器如果队列空间耗尽,就会导致丢弃分组,进而导致重传。重传又会引起分组的重复和乱序。 真实环境

基本套接字API回顾

SOCKET socket (int domain, int type, int protocol)
// 成功返回套接字描述符,失败时返回-1

套接字API与协议无关。

domain是个常量,表示通信域,有以下两个

AF_INET
AF_LOCAL

type说明套接字的类型,有常见的以下几种

SOCK_STREAM
SOCK_DGRAM
SOCK_RAW

protocol说明使用哪种协议,对tcp/ip来说,可以直接由type字段隐式说明,参数被设置为0

int connect (SOCKET s, const struct socketaddr *peer, int peer_len)
// 成功时返回0, 失败时返回非0
  • s: 套接字描述符
  • peer: 是一个地址结构,存储对等实体的地址和其他信息
  • peer_len; 是地址结构的长度

connect一旦建立起来,就可以传输数据。在unix中,套接字描述符可以像文件描述符那样调用read和write。但是windows

int recv (SOCKET s, void *buf, size_t len, int flags)
int rend (SOCKET s, cosnt void *buf, size_t len, int flags)

参数s, buf, len和read, write参数一样。flags通常和系统有关。

unix和win都支持以下flag

瞥一眼

理解面向连接和无连接协议的区别

  • 面向连接和无连接,指的都是协议,不是物理介质,是指数据在介质上如何传输
  • 本质区别是, 对于无连接协议,每个分组的处理都是独立的。对于面向连接的协议,分组还要维护后续分组的相关信息。
  • 无连接协议是面向连接协议的基础

无连接协议就像是寄信,每封信都有自己的收件人地址,你可以同时给多个人寄信。邮局处理信件也不会管每封信之间的关系。

面向连接的协议就像是打电话,一个人先拨号,等另一个人说喂,然后自己在说我是某某某。说完话了,一个人会说,拜拜,另一个也会说拜拜。 有时候你听不清楚对方在说什么,还会说:麻烦你在说一遍,我没听清。或者:你说的太快了,麻烦说慢一点。

--------
应用程序
--------
TCP和UDP
--------
  IP
--------
物理接口
--------

TCP的每个分组成为段(segment), 是放在IP数据包中发送的。但是IP数据报并不保证数据的可靠到达。所以TCP必须自己实现可靠性。

TCP使用三个功能实现可靠性

校验和
序列号
确认重传机制

TCP的三个功能中,确认重传机制最为复杂。

TCP接收窗口

tcp ip高效编程 笔记

TCP到达时,所有序列号在窗口范围之外的,都会被直接丢弃

TCP发送窗口

tcp ip高效编程 笔记

  • 发送窗口分为两个部分,已经发送出的但是还没有收到确认的,还有可以发送但还没有发送的
  • 在4-7字节已经发送出去之后,TCP会启动一个RTO(retransmission timeout)超时重传定时器,如果定时器超时之前这四个字节没有被确认,就会重传这四个字节。要注意重传的自己可以要比四个字节要多。
  • 重传并不意味着数据没有到达目的地,也有可能是ACK丢失

TCP是一种流协议

TCP是一种流协议,并没有固定的报文和报文流的概念。

发送两次报文并不发送两个独立的实体,两次调用send, 只是将数据交给底层TCP/IP栈。至于底层是如何发送这两个数据的,由底层自己决定。

tcp ip高效编程 笔记

底层将数据发出去有很多决定因素

  • 发送窗口
  • 拥塞窗口
  • 路径最大传输单元
  • 输出队列中有多少数据

tcp ip高效编程 笔记

不要低估TCP的性能

TCP并不是绝对可靠

  • 故障模式
  • 对等实体崩溃
  • 网络中断

不要把OSI七层模型太当回事

实际上OSI模型由很多缺点,本质上说OSI协议已经停用了。OSI模型是理想,TCP/IP才是现实。

理解TCP写操作

  • 从应用程序角度看,send
  • 从TCP角度看,慢启动,ng算法

TIME-WAIT

tcp ip高效编程 笔记

  • 通常,只有主动关闭连接的一方会进入TIME-WAIT阶段
  • RFC 793将MSL定义为两分钟,那么2MSL就是4分钟。实际的操作系统可以将MSL设置为更低的值,如30秒。
  • 如果连接处于TIME-WAIT阶段,又有分组到达,就会重启2MSL定时器。

使用TIME-WAIT的目的

  • 维护连接状态,以防主动发起连接关闭的哪一方最后一个ACK丢失造成另一端发送FIN
  • 耗尽网络中所有此连接的走失提供时间

想一想,如果主机1在发出ACK之后立即关闭了连接,会发生什么事?

AB分别为主机

有 TIME-WAIT状态时,如果ACK丢失,那么B会重发FIN, A处于TIME_WAIT阶段时,再次收到FIN, 那么就会再次发送ACK, 并重启激动2MSL计时。

tcp ip高效编程 笔记

无TIME-WAIT状态时, 主机A的收到FIN后,立即释放端口,那么该端口处于未监听状态。当数据被发送到为监听的端口时,发送方会收到链接重置的报文。

tcp ip高效编程 笔记

无TIME-WAIT状态时, 主机A的端口已经被新的应用程序占用,新的连接的数据可能被迟来的数据破坏。

tcp ip高效编程 笔记

TCP的状态转移图

  • TCP一共有11中状态
  • 左下角虚线方框中是主动关闭方关闭时会经历的状态转移

tcp ip高效编程 笔记

尽可能写入一个大块数据,而不是频繁的写入小块的数据

参考书籍


以上所述就是小编给大家介绍的《tcp ip高效编程 笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精通Spring 4.x

精通Spring 4.x

陈雄华、林开雄、文建国 / 电子工业出版社 / 2017-1-1 / CNY 128.00

Spring 4.0是Spring在积蓄4年后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。Spring 4.0引入了众多Java开发者翘首以盼的基于Groovy Bean的配置、HTML 5/WebSocket支持等新功能,全面支持Java 8.0,最低要求是Java 6.0。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java W......一起来看看 《精通Spring 4.x》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具