1 UDP:用户数据报协议与TCP传输协议的比较
1)TCP提供客户与服务器的连接,UDP不提供。
2)TCP提供可靠性传输,当TCP向另一端发送数据时它要求对端返回一个确认。注意可靠传输并不能保证数据一定会被对方端点接受,因为这是不可能做到的。即TCP提供的是数据的可靠投递或者是故障的可靠通知。
3)TCP给发送数据的每一个字节关联一个序列号进行排序,如果发送的序列非顺序到达,接收端的TCP将会对接收的序列排序,再把结果传给应用进程。UDP提供不可靠传输,不提供确认,序列号,超时重传机制。
4)TCP提供流量控制,TCP总是会通知对端它能够接收多少字节的数据(即通知窗口),UDP不提供流量控制,UDP按发送端的速率发送数据,而不管接收端的缓冲区是否装的下。
2 TCP协议三次握手建立连接过程与释放连接过程
一个完整的三次握手也就是: 请求---应答---再次确认。
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
建立TCP连接好比日常生活中的电话连接,socket()函数等同于有电话可用,bind相当于把电话(socket函数返回的套接字)和自己的手机号码绑定(sockaddr_in结构体包含本机IP和服务端口号)。listen函数相当于振铃(有连接请求就要准备处理),它可以使你听到一个外来的电话。connect函数相当对方(客户端)知道你的电话号(IP+PORT)码并拨打它,accept函数即被呼叫(服务器)回电话,从accept函数返回一个新的连接描述符(服务器IP+port _s: 客户端IP+port_c),注意这个描述字是不同于客户端请求连接描述字(客户端IP+port_c:服务器IP+port_s).剩下的就是通话的内容比如读写数据。
TCP的·连接中止:
TCP的连接中止需要4个分节
首先某个进程应用进程调用close函数,这一端称为主动关闭,这一端的TCP发送一个FIN M分节,表示数据发送完毕。
接收FIN的另外一端执行叫做被动关闭,需要发送确认信息ACK(发送端FIN M +1),然后再发送一个FIN N(这里算作是两个节即发送确认和发送FIN N)。
最后接收到这个FIN的原发送端TCP(即执行主动关闭的那一端)对它进行确认。
3 TIME_WAIT状态
主动关闭端需要TIME_WAIT状态,执行主动关闭那段进入这种状态,该端点停留在这种状态的持续时间是最长分节生命期MSL的两倍任何TCP实现都需要选择一个MSL值,RFC建议值是两分钟,这个时间是有限的,因为IP数据包有一个TTL(time to live)域,共8比特即限制每个数据包的跳数为255.
存在TIME_WAIT状态的两个理由是:
1)可靠的实现TCP全双工连接的中止
TCP必须处理连接终止序列四个分节中任何一个分节的丢失情况,所以最后加上TIME_WAIT防止最终发送的ACK数据丢失。注意进入TIME_WAIT状态的是执行主动关闭的那一端。
2)允许老的重复分节在网络上消失
tcp将不给处于TIME_WAIT状态的连接启动新的化身,因为TIME_WAIT状态的持续时间是2MSL这就足够允许某个方向上的分组最多存活MSL秒即被丢弃,另一个方向的应答最多存活MSL秒也被丢弃。所以此连接结束时再启用连接新的化身时候不会出现老的重复分节。