TCP数据传输
来源:互联网 发布:反欺诈 社交网络模型 编辑:程序博客网 时间:2024/05/21 22:57
分析TCP的数据传输过程出现的错误就得先知道TCP传输的原理
send ->SOCKET缓冲区->通过OSI顺序进行封包->网卡缓冲器->发送到网络中->网卡接受(目的地非目标主机则扔掉)->OSI解包->SOCKET缓冲区->recv
书上说的TCP是可靠传输,若数据包在上面那个流程丢了,源主机没有在规定的时间收到目的主机的回复,就会按照重传时间进行重传,注意若网络环境不好的话肯定的丢包,你不能指望一个在带宽峰值的下行中能把所有数据都不丢,据楼主了解TCP只会做至多15次重传,若目的主机还没有收到,就不会再进行重传,将缓冲区中的包扔掉,不再进行重传。
在SOCKET编程中很多同学不太了解阻塞模式与非阻塞模式,看上面的传输过程,能说是SOCKET阻塞的也就是send-socket缓冲区与socket缓冲区到recv,也就是说当你进行阻塞接受时只有当缓冲区中接收到数据才返回,将数据都放进缓冲区才返回,若是非阻塞则,不管缓冲区是否有数据,recv都返回,根据返回值来确定是否接受到数据,send也是,若没有将数据发送到缓冲区则会返回错误,的自己做处理再次发送数据.
设置套接字非阻塞ioctlsocket(),Linux与win都能用,win套接字还有自己专用的设置异步函数WSAAsyncselect()和WSAEventselect()
u_long mode = 0;
ioctlsocket(s,FIONBIO,&mode);
控制为阻塞方式。
u_long mode = 1;
ioctlsocket(s,FIONBIO,&mode);
控制为非阻塞方式。
TCP进行丢包可能是没有发送,发送逻辑出问题了,也可能是真的丢包了,具体问题还得自己细细分析
补充一句socket的模式是一个典型的门面模式,各个网络进程通过socket进行数据发送与外界进行联系,各个进程之中没有联系,降低耦合度,门面模式就是为了降低模块之间的耦合度设计的
- TCP数据传输
- NIO实现TCP数据传输
- tcp 数据传输实例测试
- TCP/IP数据传输过程
- TCP数据传输(三)
- java tcp数据传输实例
- socket实现TCP数据传输
- TCP的数据传输小结
- socket实现TCP数据传输
- tcp float数据传输问题
- TCP可靠的数据传输
- TCP udp数据传输协议
- TCP数据传输过程
- TCP可靠数据传输
- TCP的数据传输
- Java使用TCP实现数据传输
- 关于TCP/UDP数据传输过程
- TCP套接字的数据传输
- ios开发之xcode环境介绍
- 华为编程规范:函数部分
- Oracle权限问题
- 用套接字实现UDP通信
- 剑指offer——面试题47:不用加减乘除做加法
- TCP数据传输
- JS是按值传递还是按引用传递?
- Pipeline详解及Spark MLlib使用示例(Scala/Java/Python)
- Java常见异常总结
- 嵌入式开发人员测试题(二)
- Java集合框架
- C语言中可变参数函数 三个点“…”
- keil调试过程中遇到Reprogramming flash
- Linux下inotify机制简介