TCP/IP协议学习笔记

对于理解网络工作过程的重要但又容易忘记的协议:
ARP(Address Resolution Protocol,地址解析协议):物理层的数据传输是根据MAC地址寻找目的主机的,ARP协议维护一个本网段内的IP-MAC映射表,将上层以IP地址为目的数据包封装成以MAC地址为目的地址的帧在物理网络上传输。
RARP(Reverse Address Resolution Protocol,反向地址解析协议):无IP地址的主机发RARP广播向网段内RARP服务器请求IP地址。
ICMP(Internet Control Message Protocol,Internet控制报文协议):算是一个应用层协议了,用于提供问题反馈功能。
NAT(Network Address Translation,网络地址转换协议):在使用私有地址的局域网中访问Internet,NAT将私有地址转换为共有地址。 NAT介绍

介绍:http://blog.csdn.net/wu18372504010/article/details/76944043

TCP工作过程:
分段与分片:

物理层有一个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分片情况。


细节部分:对IP分片的数据报来说,即使只丢失一片数据也要重新传整个数据报(既然有重传,说明运输层使用的是具有重传功能的协议,如TCP协议)。这是因为IP层本身没有超时重传机制------由更高层(比如TCP)来负责超时和重传。当来自TCP报文段的某一段(在IP数据报的某一片中)丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(可能有多个IP分片),没有办法只重传数据报中的一个数据分片。

建立连接和关闭连接

传输数据

TCP/IP工作逻辑模型:
发送方主机上的不同进程将数据交给同一个传输层,这种技术叫 复用。接收方的传输层根据报文首部的端口号将数据交付给目标进程,这技术叫 分用

TCP/IP注意地方:
       TCP在断开连接时,最先断开连接的一方最后会有一段时间处于TIME-WAIT状态,然后才会处于CLOSED状态。这个时间为2MSL,其中MSL为报文在传输线路中最大存活时间,一般设置为30秒到2分钟。也就是说TCP会处在TIME-WAIT状态持续2-4分钟。

       为什么设置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)大多数系统都是小端存储;

网络传输字节顺序:个人假想为以低地址向高地址的方向读取并顺序传出,如果是大端机器那么就是高字节先到达低字节后到达,小端机器则相反。只要两端机器一致,那么数据就不会出错。但网络的目的是通用的,所以就要求所有在网络上传输的数据是以高字节在前传输的。但网络字节顺序的意思其实也是定义机器上的存储顺序即大端存储,只是用在网络上换了一个名字而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值