一.TCP/UDP区别

  TCP UDP
是否连接 面向连接 无连接
可靠性 可靠地 不可靠
速度
多点否 一对一 一对一、一对多、多对多
使用场合 传输大量数据 少量数据
例如 传输文件 IM、在线视频、DNS交换

 

(1)连接

TCP基于连接,比如你给别人打电话,要对方接听之后才能开始通话。

而UDP不需要建立连接,就像你看电视,视频数据一直在从运营商那边传到你电视机上,他不管你电视机有没有开,只管把数据送过来。

所谓无连接,是指没有确定目标系统在做好准备之前就发送数据

(2)数据可靠性

TCP要先建立连接,所以数据传输是可靠的,比如打电话我们就能确保对方都能接收到通话数据,而UDP不建立连接,就像发短信,发邮件,我发送出去之后,并不知道对方有没有收到,除非对方返回一条消息给我说他收到了短信  

 其他,TCP有 数据包编号、保证数据顺序、窗口技术、流控制、超时重发与丢弃重复数据

二.TCP三次握手(建立连接)/ 四次握手(断开连接)

第一次握手:客户端发送syn包(第一次请求的数据包);并进入syn_send状态,等待服务器确认;

第二次握手:服务器接收到syn包(syn+ack包),必须确认客户的syn包,同时自己也发送一个syn包,此时服务器进入syn_recv状态;

第三次握手:客户端收到服务器的syn+ack包,向服务器发送确认包ack,此包发送完毕客户端与服务器端建立连接进入established状态;完成三次握手

深入浅出类比电话系统:建立TCP连接就好比一个电话系统[Nemeth 1997]。socket函数等同于有电话可用。bind函数是在告诉别人你的电话号码,这样他们可以呼叫你。listen函数是打开电话振铃,这样当有一个外来呼叫到达时,你就可以听到。connect函数要求我们知道对方的电话号码并拨打它。accept函数发生在被呼叫的人应答电话之时。由accept返回客户的标识(即客户的IP地址和端口号)类似于让电话机的呼叫者ID功能部件显示呼叫者的电话号码。

四次握手,过程暂略

注意:TIME_WAIT 2MSL,可靠的实现TCP全双工的终止;②允许老的重复分节消逝(麻烦还不理解)A主动端  B被动端

 

持续时间是最长分节生命期(maximum segment lifetime,MSL)的两倍2MSL。任何TCP实现都必须为MSL选择一个值(2分钟/30秒)。

① 为了保证A发送的最有一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的报文段。

② 就是防止上面提到的已失效的连接请求报文段出现在本连接中,A在发送完最有一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。

三.网络编程socket

Socket建立网络连接的步骤:

 Socket建立连接需要一套套接字,运行在客户端的叫ClientSocket,运行在服务器端的叫ServerSocket;建立连接分为三个步骤:服务器监听,客户端请求,连接确认

 1)服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。  

 2)客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。  

 3)连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

4.网络地址分配??(4,5,6见【网络】分层、地址分配

5.网络分层?? 

OSI的七层网络结构图和TCP/IP的五层结构图


 

一些笔试面试题目

1.腾讯笔试题:tcp三次握手的过程,accept发生在三次握手哪个阶段?

accept发生在三次握手之后。

第一次握手:客户端发送syn包(syn=j)到服务器。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。

三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接。

 2. 三次握手建立连接时,发送方再次发送确认的必要性

防止已失效的连接请求报文段突然又传到了"服务器"。假定“客户端”第一次握手请求报文请求并没有丢失,而是在某些网络结点长时间滞留了,一直延迟到连接释放以后的某个时间才到达,本来这是一个早已失效的报文段。但服务器收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了,此时客户端已经超时失效,B的许多资源就这样白白浪费了。

参考:网络协议相关总结,TCP/IP,UDP 

常见网络编程面试题答案征集与面试题(收集) 

 

posted on 2014-05-14 15:43  zhangxh_Doris  阅读(823)  评论(0编辑  收藏  举报