物理层有一个MTU(最大传输单元)的限制,不同的物理网络不一样,以太网为1500个字节。IP协议在接收到上层的数据段时会进行适当的分片形成IP数据包,以保证能在物理网络上传输。分片的逻辑由IP包头的标识符(Identifier)、标记(Flags)和片偏移(Fragment Offset)这三个字段承载,具体解释。通常都不用分片,因为TCP数据段都是小于MTU的,只是IP数据包从一个大带宽的物理网络经网关到小带宽的物理网络时3层交换机(路由器、网关)会进行分片。另外,IP数据报分片后,只有第一片带有UDP首部或ICMP首部,其余的分片只有IP头部,到了端点后根据IP头部中的信息再网络层进行重组。而TCP报文段的每个分段中都有TCP首部,到了端点后根据TCP首部的信息在传输层进行重组。IP数据报分片后,只有到达目的地后才进行重组,而不是向其他网络协议,在下一站就要进行重组。
由于TCP/IP协议的每层是独立的,因为如果应用层要传输很多数据的话是不可能一次性传完的,TCP协议在建立连接的时候会协商合适的MSS(最大分段大小),当TCP协议接收到应用程序的数据时会按照MSS来分段,以使数据传输更为合理,分段逻辑由TCP数据段段头相关字段承载。MSS的值一般为MTU值减去两个首部大小(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以如果用链路层以太网,MSS的值往往为1460。这样数据到IP层时就不会进行分片增加额外的开销。
由于UDP数据报不会自己进行分段,因此当长度超过了MTU时,会在网络层进行IP分片。同样,ICMP(在网络层中)同样会出现IP分片情况。
为什么设置TIME-WAIT状态?原因有两个:
A) 因为最后发送的ACK报文可能丢失,导致对方再发送一次FIN报文,如果这时不处于TIME-WAIT状态,会用RST报文应答,这样会导致对方进入错误处理,而不是有序断开。当然这再次发送的ACK报文也可能丢失,也有可能导致对方再次发送的FIN报文。
B)是为了防止出现已经“失效的连接请求报文”导致建立连接。因为在建立连接的时候,可能连接请求报文在线路中超时,导致请求端再次发送报文建立了连接。但是这个报文在链路中并没有丢失,而是在晚到了,要是不处于TIME-WAIT状态的,就会以为这是一个新的连接请求,再次建立连接。在TIME-WAIT状态时,会决绝在该套接字上建立连接。
因此,在写程序的时候应该小心这个TIME-WAIT状态。
socket编程:http://blog.csdn.net/u011641885/article/details/46591825
winsock的使用:
socket套接字是通信时为传输提供的句柄,Winsock的操作都是基于套接字实现的。创建一个套接字有socket和WSASocket方法(API)
1、http://www.cnblogs.com/endv/p/5440886.html
2、。
机器内字节存储顺序:主机字节顺序
big_endian:大端存储,地址指向最高有效字节,高字节存储在低地址,低字节存储在高地址。在网络中将IP和端口指定为多字节时使用大端存储,也称为网络字节顺序(network_byte)貌似MAC OS使用的是大端存储方式;
little_endian:小端存储,地址指向最低有效字节,低字节存储在低地址,高字节存储在高地址。本地主机存储IP和端口制定的多字节时使用,也称为主机字节顺序(host_byte)大多数系统都是小端存储;
网络传输字节顺序:个人假想为以低地址向高地址的方向读取并顺序传出,如果是大端机器那么就是高字节先到达低字节后到达,小端机器则相反。只要两端机器一致,那么数据就不会出错。但网络的目的是通用的,所以就要求所有在网络上传输的数据是以高字节在前传输的。但网络字节顺序的意思其实也是定义机器上的存储顺序即大端存储,只是用在网络上换了一个名字而已。