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进行数据发送与外界进行联系,各个进程之中没有联系,降低耦合度,门面模式就是为了降低模块之间的耦合度设计的

0 0
原创粉丝点击