TCP与UDP

TCP与UDP位于网络通信层中的同一层,首先看一下它们在网络通信层中的位置:

            

TCP与UDP就位于传输层。

首先介绍一下TCP协议

 三次握手,以访问www.baidu.com为例 

 ① 客户端发送报头  标志位 SYN  ;SYN表示同步的意思 暂时就理解为要求对方返回数据;  sequence number (序列号)为  0(或者为j)

 ② 服务器 收到请求后 回复,报头标志位 SYN  ACK,SYN的意思同上, sequence number (序列号)为  0(或者为n); ACK的意思 是对客户端发送信息的确认 值为 0+1 (或者为 j+1)

 ③ 客户端收到服务器的信息后 回复一个报文,报头标志为ACK 值为1 (或者为n+1)

这样三次握手完毕;  如果再报文中 没有ACK 标志位,那么 acknowledgment number 也就没有意义。

OK  看一下报文吧!

握手协议的目的有两个 :①  确认网络是不是通的         ② 初始化序列号

 

下面看一下握手之后  是怎么发送消息的

以浏览器访问www.sogou.com 为例,看一下他们发送数据的的报文,使用wireshark 工具抓包,查看transmission control protcol层的协议

浏览器发送的第一条信息

  浏览器发送的第二条信息

  

下面看一下浏览器的回复

 

基本的通信就是这样的:

  1、客户端发送消息(报头 + 包体)

    报头:源端口、地址端口、序列号、报文长度、标志位、windows size value(缓存大小)

    包体:

  2、发送完消息之后,这一条消息会被放在一个重发队列中,如果再一段时间内没有收到对方的回复(对方会收到后会回复的),则重发。如果收到回复,则在重发队列中删除。

  关于TCP的缓存是这样的,假如要发送一段很长的消息,TCP会将这些消息分为几段来发送(截图中的 TCP segment a ressembeled PDU);为什么呢  这是由于TCP缓存决定的,关于TCP的缓存理解的还不是很清楚,这个缓存是在握手协议中就规定好的。主要原因是接收数据的一方,要将接受到的数据放在缓存里,而这个缓存又好像是受链路层的影响,,这就不太懂了,所以 TCP会分片发送。

 

四次挥手:

  客户端 发送 FIN标志的报头 报头中带有序列号

  服务端 回一个ACK标志的报头 ACK值为 收到的序列号  +  1   (为了防止 客户端重发 FIN  报文)

  服务端发送一个 FIN标志的报头  报头中有一个序列号

  客户端 回一个ACK标志的报头  ACK的值 为收到的序列号 +1

 

 

下面说一说 UDP吧;UDP也是分为 报头 和  包体的

UDP的报头

源端口、目标端口、报文长度、校验值   只有四个字节

UDP是无连接的,也就是在只管发送数据,至于网络通不通 或者 对方有没有接受到,不管不问。因此可靠性较差;

但是UDP相对于TCP来说 也是由有点的;

1、资源与时间消耗少 (报头短   没有握手协议等)

2、可以抢占网络  在网络不好的情况下,TCP发送速率会动态调节(具体怎么调节的不清楚)  但UDP仍然会向网络层扔大量数据

比如 QQ,就是使用的UDP协议,不过QQ在应用层 对 传输的可靠性做了处理。

QQ使用UDP的原因大概如下:资源占用少  时间消耗少  而且当时 没有epoll技术 去实现 多链接中 只有少数活跃这种病发情况的处理,另外 最初 QQ只有一个服务器,所以不能使用太多资源。

所以 UDP虽然“素质”差点  但如果再上层保证传输的准确性,也是很不错的选择,ping  也是发生的UDP协议。

 

 

问题:TCP中的缓存机制  MSS接受上限  从路由缓存中获得   等知识不了解。

 

posted @ 2015-09-05 14:51  沙中世界  阅读(267)  评论(0编辑  收藏  举报