传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,是为了在不可靠的互联网络上提供可靠的端到端字节流传输协议。
顾名思义啊,这也是他的特点,以下来自百度:
今天主要说下tcp的工作方式,大家也都听说过三次握手,四次挥手,我现在以抓包的方式来看一下:
三次握手:
client发出SYN连接请求后,等待server回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认就行。 我们来访问一下百度,看看报文过程:
这个就是三次握手了,一旦建立成功了,就可以发送信息了,我们就能看到电脑发出的hello,现在看看第一步,发送时,客户端会把自己的同步序列号SYN置为1,序列号seq为x(随机的),比如报文的1347308416
再来看第二步,回复时,会把自己的同步序列号SYN置为1,seq置为y(随机的),确认标志位ACK为上一步的seq+1,报文为1347308417
第三步,客户端收到服务端发来的验证请求后,会使自己的seq+1,故seq=x+1,并且回复ACK请求,ACK=y+1。此时三次握手完成,可以发送数据了。
下面的图再来理解下:
四次挥手:
第一次挥手:客户端,会率先发起结束断开连接的请求:
Flags:Fin位和Ack标记为1,说明这是个一个断开连接的请求的报文。此时我们不发送数据了,但是还可以接收数据。同时设置自己的序列号为seq=x,Ack为z
第二次挥手:对上一个断开连接请求的报文进行确认,Flags:Ack=1,并同时,停止接收数据。确认序号为收到的Ack=x+1,自己的seq为z
第三次挥手:服务器关闭与客户端的连接,发送Flags:FIN=1,ACK=1,序列号seq=y,ack=x+1。同时,服务器也会停止发送数据。
问:那为啥要三次,两次行不行?
答:不行,①防止重复连接。比如在网络状况比较复杂或者网络状况比较差的情况下,发送方可能会连续发送多次建立连接的请求。如果 TCP 握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接;②同步初始化序列化。而如果是两次握手的话,就无法进行序列号的确认工作了,因此也就无法得到一个可靠的序列号了。
第四次挥手:是客户端对服务器断开连接请求的进行确认。发回Flags:Ack位标记为1。确认序号Ack=y+1,序列号为seq=x+1
此时,客户端也停止接收数据了。四次挥手结束。 下面的图再来总结下:
UDP 介绍与比较
UDP(User Data Protocol,用户数据报协议)是无连接的、简单的、面向数据报的传输层协议。也就是 UDP 在发送数据之前,无须建立客户端与服务端的连接,直接发送消息即可。 两者的区别:
1、TCP是面向连接的,UDP是面向无连接的;
2、UDP程序结构较简单;
3、TCP是面向字节流的,UDP是基于数据报的;
4、TCP保证数据正确性,UDP可能丢包;
5、TCP保证数据顺序,UDP不保证。