tcp:可靠,速度慢。(服务端与客服端每发一次包都要确认一次。)
单工:只能发送。(eg.收音机,广播)
半双工:不能同时。(eg.对讲机)
全双工:允许数据在两个方向上同时传输。
客户端和服务器之间建立正常的TCP网络连接(三次握手):
第一次
客户端首先发送syn(数据同步,握手包),带上seq(随机序列号:长度不定),ack(确认序列号)。
握手握一半,占用所有的空间,产生dos攻击(拒绝服务攻击),windows默认超时时间4min。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 [3]
完成三次握手,客户端与服务器开始传送数据。
四次挥手
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
ps:当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。所以建立连接需要三次握手。
但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。