![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
tcp
kaydxh
github主页:https://github.com/kaydxh
展开
-
《深入理解TCP之15不要忘记字节的性别》
15 不要忘记字节的性别15.1 大端模式是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;15.2 小端模式是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。总结小端模式:低地址存放数据的低字节大端模式:低地址存放数据的高字节uint32 x =原创 2020-06-22 20:53:10 · 211 阅读 · 0 评论 -
《深入理解TCP之14理解如何使connect调用超时》
14 理解如何使connect调用超时14.1 connect的调用过程就是三次握手得过程首先将标志位设为Non-blocking模式,准备在非阻塞模式下调用connect函数调用connect,正常情况下,因为TCP三次握手需要一些时间;而非阻塞调用只要不能立即完成就会返回错误,所以这里会返回EINPROGRESS,表示在建立连接但还没有完成。在读套接口描述符集(fd_set rset)和写套接口描述符集(fd_setwset)中将当前套接口置位(用FD_ZERO()、FD_SET()宏),并原创 2020-06-17 10:24:47 · 210 阅读 · 0 评论 -
《深入理解TCP之13服务器应该设置SO_REUSERADDR》
13 服务器应该设置SO_REUSERADDR问题:对服务器重启时,会得到“Address already in use”的原因:前一个连接仍然处于TIME-WAIT状态解决方法:设置套接字选项SO_REUSEADDR(在bind之前调用setsocketopt)首先声明一个问题:当两个socket的address和port相冲突,而你又想重用地址和端口,则旧的socket和新的socket都要已经被设置了SO_REUSEADDR特性,只有两者之一有这个特性还是有问题的。SO_REUSEADDR原创 2020-06-11 14:21:19 · 438 阅读 · 0 评论 -
《深入理解TCP之12不要用TIME-WAIT暗杀来关闭一条连接》
12 不要用TIME-WAIT暗杀来关闭一条连接12.1 连接拆除主机1的应用程序关闭自己这端的连接,使得tcp向主机2发送了一个FIN主机2对这个FIN进行ACK,并将这个FIN作为一个EOF传给应用程序一段时间后,主机2上的应用程序关闭了它那端的连接,这样就会向主机1发送1个FIN主机1会以ack应答此时,主机2关闭连接并释放资源。但是主机1还没有关闭连接,而是会进入TIME-WAIT状态,并将这个时间停留在2MSL(2个最大分段寿命的时间,TTL,MSL被RFC 793定义为2分钟,BS原创 2020-06-09 19:54:17 · 173 阅读 · 0 评论 -
《深入浅出TCP之11理解tcp的有序释放操作》
11 理解tcp的有序释放操作tcp连接的三个阶段:连接建立阶段数据传输阶段连接拆除阶段服务器和客户端可以通过关闭各自半边分连接来通知对方,它已完成应答了.效果上看,它们发送的就是一条EOF.shutdown调用int shutdown( int s, int how );how = 0 : 关闭连接的接收端(也适用于UDP)how = 1 : 关闭连接的发送端(后继所有试图对套接字进行写操作都会除错.将发送缓冲区中所有的数据都发送出去之后,tcp会向其对等实体发送一个FIN,通知原创 2020-06-08 19:07:29 · 244 阅读 · 0 评论 -
《深入浅出TCP之10理解tcp的写操作》
10 理解tcp的写操作10.1 从用户层看写操作用户程序对一条tcp连接进行写调用时,首先会将数据从用户缓冲区赋值到内核中去,当send返回时(除非tcp发送缓冲区满了,否则写操作是不会被阻塞的),具体发送了多少数据依赖于连接状态.写操作很少向tcp返回错误.因此,常见错误通常由读操作返回,写操作只返回写调用时发生的明显错误,如下:套接字描述付无效文件描述符指向的不是套接字调用中指定的套接字不存在或未连接缓冲区地址参数指向无效地址EPIPE或SIGPIPE是个例外,连接被对等实体重置原创 2020-06-05 10:18:45 · 147 阅读 · 0 评论 -
《深入浅出TCP之9成功的LAN策略不一定能推广到WAN中去》
9 成功的LAN策略不一定能推广到WAN中去可能出现的问题有两类:由于WAN引入了额外的时延,在WAN上可能会出现问题在LAN上可以工作的不正确代码,在WAN上可能会出现问题出现1中的问题通常意味着要考虑重新设计应用程序了....原创 2020-06-05 10:13:43 · 108 阅读 · 0 评论 -
《深入浅出TCP之8提防对等实体的不友好动作》
8 提防对等实体的不友好动作编写网络程序,需要进行防御性编程,最终要的原则是:即使两端的协议都是我们自己实现的,也不能认为对等实体会遵循应用协议.检测客户端的终止如果客户端在发送quit命令之前就崩溃或终止了,此时,客户端的tcp会向对等实体tcp发送一个FIN,服务器的读操作会返回一个EOF,服务端需要显示检测EOF(0 == recv).没必要通过心跳信号来检测客户端的丢失,只要在读操作上设置一个定时器,客户端在某段时间区间内没有发出请求,服务器就认为客户端已经丢失.FTP服务器就是这么做的.原创 2020-06-04 15:06:42 · 157 阅读 · 0 评论 -
《深入浅出TCP之7TCP/IP不是轮询的》
7 TCP/IP不是轮询的7.1 tcp无法将连接的丢失立即通知应用程序的原因如果实现立即通知连接丢失的功能,可能使用某种轮询的协议不停地测试对等实体是否存在.在任何情况下,实现这种功能都是要付出代价的,需要消耗一定的网络带宽.设计tcp/ip的基本原则之一就是端到端原则,将其应用与网络时,基本上就是指多有智能都要尽可能地靠近连接的端点,网络自身应该是相对"亚的".比如,tcp自己处理错误控制,而不依赖网络提供.在监视对等应用程序间的连接,就意味着,需要应用程序来提供这项功能.tcp/i原创 2020-06-03 18:34:08 · 620 阅读 · 0 评论 -
《深入浅出TCP之6要认识到TCP是一个可靠的,但并不绝对可靠的协议》
6 要认识到TCP是一个可靠的,但并不绝对可靠的协议6.1 可靠性是啥第一个可以讨论确保可靠传输问题的地方就是应用程序B所在主机的tcp层。当一个段抵达应用程序B所在主机的tcp层时,唯一可以确认的就是这个段已经到达了,但它可能损坏了,可能是重复的数据,可能是错序的,或者是由于其他一些原因无法接受的。注意,发送端tcp无法对这些抵达接收端tcp的段作出任何保证。但接收端tcp要像发送端tcp确认,也就是说它ACK的数据以及在此数据之前到达的所有数据在tcp层都已经正确接收了,发送端tcp可以安全的原创 2020-06-01 15:57:37 · 522 阅读 · 0 评论 -
《深入浅出TCP之5不要低估TCP的性能》
5 不要低估TCP的性能任何协议的性能都与网络、应用程序、负载和包括实现质量在内的其他一些因素有关。5.1 TCP性能TCP在基本的IP数据报服务的基础上增加了可靠性和流量控制功能,而UDP只添加了一个检验和,但是这并不表示UDP的性能比TCP好。TCP为了提供可靠性,接收端TCP必须向发送端TCP发送ACK,但是这个工作量没有想象的那么多。首先,接收端可以通过它要发回给对等实体的数据来捎带ACK,实际上,很多TCP实现都会将ACK延迟几个毫秒发送,以防止本端应用程序有对输入分段的应答发送。原创 2020-05-28 14:04:58 · 249 阅读 · 0 评论 -
《深入浅出TCP之0客户端-服务器结构》
0 客户端-服务器结构0.1 客户端和服务端位于同一台主机上由于没有网络延迟,更容易判断客户端和服务器应用程序的原始性能提供了理想的实验环境,分组不会被丢弃、延迟、传输时也不会失序注意:如果施加足够的压力也会造成UDP报文丢失。0.2 客户端和服务端位于同一局域网内的不同机器上这种情况还是近乎理想,分组很少丢失,并且实际上不会出现错序的情况。0.3 客户端和服务端被广域网隔开两个应用程序不在同一个局域网中,从一个应用程序传向另一个应用程序的IP数据报必须经过一台或多台路由器。随着流量的原创 2020-05-27 10:29:31 · 210 阅读 · 0 评论 -
《深入浅出TCP之4TCP是一种流协议》
4 TCP是一种流协议数据是以字节流的形式传递给接收者,没有固有的报文或报文边界分概念。send通常只是将数据复制到主机的tcp/ip栈中,就返回了,由tcp来决定需要立即发送多少数据(取决于,发送窗口,拥塞窗口,MSS等)tcp会记录它发送了多少字节,以及确认的字节,但它不会记录这些字节是如何分组的变长报文,一般在每条报文前面加上一个首部,这个首部至少包含报文的长度,首先读取定长的报文头部,从首部解析出可变部分的长度,然后读取可变长部分...原创 2020-05-27 10:23:28 · 193 阅读 · 0 评论 -
《深入浅出TCP之3理解私有地址和NAT》
3 理解私有地址和NAT3.1 私有地址10.0.0.0 ~ 10.255.255.255 (10/8 前缀)172.16.0.0 ~ 172.31.255.255 (172.16/12 前缀)192.168.0.0 ~ 192.168.255.255 (192.168/16 前缀)3.2 NAT(网络地址翻译)转换机制静态模式 一一映射将私有网络上的部分或所有主机的私有IP地址都映射为一个固定的、全局分配的地址。缓冲池模式-多对多映射NAT设备有一组全局分配的IP地址可用,它会将其原创 2020-05-26 10:33:08 · 249 阅读 · 0 评论 -
《深入浅出TCP之2理解子网和CIDR的概念》
2 理解子网和CIDR的概念2.1 分类编址地址被分为两部分,第一部分是网络ID,用来标识地址所指的特定网络,之后是主机地址,标识那个网络中一台特定的主机。A类网络: 0.0.0.0 ~ 127.255.255.255 网络位8位,前导:0B类网络: 128.0.0.0 ~ 191.255.255.255 网络位16位 前导:10C类网络: 192.0.0.0 ~ 223.255.255.255 网络位24位 前导:110还有D类网络主要是用于多点广播地址,前导:1110E类网络是保留的,前原创 2020-05-25 13:17:25 · 228 阅读 · 0 评论 -
《深入浅出TCP之1理解面向连接和无连接协议之间的区别》
1 理解面向连接和无连接协议之间的区别1.1 区别区别:对无连接协议来说,每个分组的处理都独立于所有其他分组,都是独立寻址,而面向连接的协议来说,协议面向连接的协议来说,协议实现规则维护了与后继分组有关的状态信息。注意:对于无连接,如果应用程序实现的功能较为复杂,就可能需要维护数据报之间的状态,但重点是状态由应用程序维护,而不是协议维护。1.2 TCP/IP协议栈TCP/IP分为四层,分别是接口层/物理层/链路层–>网络层–>传输层–>应用层。网络层主要就是IP层,该层提供了一原创 2020-05-24 17:19:46 · 719 阅读 · 0 评论