最近在读《Unix网络编程》和《TCP/IP详解》两本书,有了一些自己的心得与体会,总结下其中典型的问题。

1. 为什么建立连接需要三次握手?

  谢希仁的《计算机网络》对这个问题有以下分析:

  服务端接到客户端的syn之后在发送ack的同时还要顺带一个syn来让客户端再发送一个ack相应这个syn.这主要是由于链路的不可靠,客户端发送的连接请求用了很长时间到达服务器,而再此之前客户端很可能因为迟迟没收到服务器端的相应而重发了该连接请求并顺利到达服务器,服务端相应该请求。而之前的连接请求终于到达了该服务器,如果服务器不向客户端发送syn,那么这个连接请求就会被服务器认为是一个有效的连接请求而占用相应的服务器资源,而实际上这只是一个超时到达的连接请求。因此需要服务器端强制重新发送一个syn来向客户端确认之前,客户端发送的syn是有效的。

  这个解释基本上我觉得还是比较好的,但是如果面试的时候如果能说出自己对问题的理解就更好了。我们先来分析下:syn的主要作用是建立连接,与一般的TCP报文的锁不同是的其TCP选用字段有MSS(最大报文长度字段)也就是说通过syn,客户端和服务端分别向对方通报了自己的最大的报文长度。

2. TIME_WAIT是2MSL的作用

  MSL是报文在网络中的最长存活时间。在主动关闭连接的一端发送最后一个ACK之后为了确认对方能够收到这个ACK必须处于等待状态,数据报文在源节点和目的节点之间往返的最长时间就是2MSL。如果不等待这个2MSL而是发送ACK之后直接关闭连接,那么如果被动关闭方没收到ACK之后会进行重传,而主动关闭方由于已经关闭该连接了,所以会直接响应RST,被动关闭方会认为这是一个错误。

3. 什么是全双工?UDP是全双工的吗?

  关于半双工可以看IPC中的管道通信,创建一个管道,管道需要绑定两个文件描述符readfd和writefd,分别用来读和写。也就是说读写需要分开用两个文件描述符才能完成。而全双工指的是一个文件描述符能同时完成读写操作。在socket编程中,无论是TCP还是UDP都可以用一个文件描述符来完成读写,因此TCP和UDP都是全双工通信。

4. QQ采用的是TCP还是UDP?QQ传输文件采用的是TCP还是UDP?

  我先说说自己的观点,QQ采用的是UDP,这里的UDP在应用上加入了序号、确认机制、超时重传,机制来保证一定程度上的可靠连接;第二是因为UDP不需要建立连接,服务器开销小,比如如果每次只需要发送很少数据到对端,导致建立连接开销很大。
  QQ传输文件采用UDP我觉得主要是考虑到UDP没有流量控制,发送端发送的数据很容易填满接收端的缓冲区,《Unix网络编程》的203,面给了一个例子,大概说的是UDP发送2000个1400字节的文件,接收端只能收到30个。因此传输较大的数据文件最好采用TCP传输。

5. 怎样用udp协议完成可靠传输?
  几乎所有的UDP通信都是经过改进的UDP协议。UDP协议不用创建连接,对短连接少量数据的传输是比较有优势的。为了保证传输的可靠性,会在应用层的发送端加上报文序号,超时重传,接收端确认报文等方式来保证可靠地传输。

TCP/UDP基本概念部分的更多相关文章

  1. HTTP TCP UDP Socket 关系的几个经典图

      从上图可以看到,TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. ...

  2. HTTP,FTP,TCP,UDP及SOCKET

    一.TCP/IP协议简析TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层:网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议传输层:TCP协议与UDP协议应用层:F ...

  3. TCP/IP基础概念及通信过程举例

    TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...

  4. TCP/UDP详解

    转载:http://www.cnblogs.com/visily/archive/2013/03/15/2961190.html, 作者:望梅止渴 相关: HTTP协议详解  深入理解HTTP协议 T ...

  5. [原]TCP/UDP使用细节备忘

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  6. IP,TCP,UDP Checksum校验

    IP数据报的校验: IP数据报只需要对数据头进行校验,步骤如下: 将接收到的数据的checksum字段设置为0 把需要校验的字段的所有位划分为16位(2字节)的字 把所有16位的字相加,如果遇到进位, ...

  7. SOCKET,TCP/UDP,HTTP,FTP

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  8. [网络] SOCKET, TCP/UDP, HTTP, FTP

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  9. High Performance Browser Networking - TCP UDP TLS

    延迟 定义和标准延迟 延迟简单地说,它是一种转移或信息包从起点到终点,所花费的时间. 延迟=发送延迟+传播延迟+处理延迟+排队延迟: Propagation delay 传播时延 传播时延这个概念.是 ...

随机推荐

  1. showMonth

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. php-Mysql示例1

  3. attitude

    刚看到一段挺有趣的游戏,分享一下. 如果 令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于 1 2 3 4 5 6 7 8 9 10 ...

  4. Hibernate(二)Hibernate 实例

    上篇Hibernate(一)JDBC简介,我们主要对JDBC进行了简单介绍和使用说明,这次我们做一个Hibernate简单实例,通过这个实例对比Hibernate和JDBC,了解Hibernate的优 ...

  5. Windows下的PHP安装文件线程安全和非线程安全的区别

    从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用 多进程的工作方式不同的是Windows系统是采用多线程的工作 ...

  6. JavaScript高级程序设计15.pdf

    组合继承的问题是会调用2次超类型构造函数 寄生组合式继承 即通过借用构造函数来继承属性,通过原型链的形式来继承方法,思路:不必为了指定子类型的原型而调用超类型的原型,我们所需要的无非是超类型原型的一个 ...

  7. 阿里云如何添加多个网站 for Linux(绑定域名)

    我们可以通过.htaccess文件来达到一个空间帮顶多个域名的效果,即域名1访问空间上webroot下的目录1(即二级目录),域名2访问空间上webroot下的目录2,等等.二级目录名为fuli,需要 ...

  8. Oracle中trunc函数、round 函数、ceil函数和floor函数的使用

    Oracle中trunc函数.round 函数.ceil函数和floor函数的使用 1.1trunc函数处理数字 trunc函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定 ...

  9. Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level(转)

    [问题] 一个python脚本,本来都运行好好的,然后写了几行代码,而且也都确保每行都对齐了,但是运行的时候,却出现语法错误: IndentationError: unindent does not ...

  10. MFC编程小技巧——强制杀死进程

    在某些应用场合下,我们可能需要在启动A进程启动时关闭进程B.MFC下该如何做呢?以下是我项目中用到的代码: int KillProcess(DWORD Pid) { //打开进程得到进程句柄 HAND ...