内容简介:套接字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到达时,所有序列号在窗口范围之外的,都会被直接丢弃
TCP发送窗口
- 发送窗口分为两个部分,已经发送出的但是还没有收到确认的,还有可以发送但还没有发送的
- 在4-7字节已经发送出去之后,TCP会启动一个RTO(retransmission timeout)超时重传定时器,如果定时器超时之前这四个字节没有被确认,就会重传这四个字节。要注意重传的自己可以要比四个字节要多。
- 重传并不意味着数据没有到达目的地,也有可能是ACK丢失
TCP是一种流协议
TCP是一种流协议,并没有固定的报文和报文流的概念。
发送两次报文并不发送两个独立的实体,两次调用send, 只是将数据交给底层TCP/IP栈。至于底层是如何发送这两个数据的,由底层自己决定。
底层将数据发出去有很多决定因素
- 发送窗口
- 拥塞窗口
- 路径最大传输单元
- 输出队列中有多少数据
不要低估TCP的性能
TCP并不是绝对可靠
- 故障模式
- 对等实体崩溃
- 网络中断
不要把OSI七层模型太当回事
实际上OSI模型由很多缺点,本质上说OSI协议已经停用了。OSI模型是理想,TCP/IP才是现实。
理解TCP写操作
- 从应用程序角度看,send
- 从TCP角度看,慢启动,ng算法
TIME-WAIT
- 通常,只有主动关闭连接的一方会进入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计时。
无TIME-WAIT状态时, 主机A的收到FIN后,立即释放端口,那么该端口处于未监听状态。当数据被发送到为监听的端口时,发送方会收到链接重置的报文。
无TIME-WAIT状态时, 主机A的端口已经被新的应用程序占用,新的连接的数据可能被迟来的数据破坏。
TCP的状态转移图
- TCP一共有11中状态
- 左下角虚线方框中是主动关闭方关闭时会经历的状态转移
尽可能写入一个大块数据,而不是频繁的写入小块的数据
参考书籍
以上所述就是小编给大家介绍的《tcp ip高效编程 笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- JavaScript异步编程笔记
- JavaScript 函数式编程笔记
- 【每日笔记】【Go学习笔记】2019-01-16 go网络编程
- 《Java编程思想》笔记07------内部类
- 《Java编程思想》笔记08------持有对象
- Golang 学习笔记十 并发编程 锁
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ajax Design Patterns
Michael Mahemoff / O'Reilly Media / 2006-06-29 / USD 44.99
Ajax, or Asynchronous JavaScript and XML, exploded onto the scene in the spring of 2005 and remains the hottest story among web developers. With its rich combination of technologies, Ajax provides a s......一起来看看 《Ajax Design Patterns》 这本书的介绍吧!
Base64 编码/解码
Base64 编码/解码
URL 编码/解码
URL 编码/解码