TCP解析

TCP传输控制协议

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议
tcp是一个可靠的协议,也就是说,除非网络出现问题,数据将被完好的按原样正确的传送到另外一端,其可靠性主要通过以下的规则实现。

1.防止数据篡改方面

为了防止数据在传输过程中被损坏,每个信息包都包含了一个==校验码==,这个校验码就是一个用来保证信息包在传输过程中没有被更改的代码。当信息包到达目的地的时候,接收方会比较校验码和收到的信息中的数据。如果校验码不对,则该信息包将被省略。

3.防止信息包丢失方面

为了防止信息报包丢失,tcp会要求接收方每收到一个信息包都反馈一下。如果接收方没有提供反馈,发送发会自动重发一次。tcp会一直试着放松信息包,一直到接受者收到为止,或者他会判断出网络连接断了,并在程序返回一个错误提示。

4.在信息包重复或顺序错误方面

为了防止信息包重复或者顺序错误,tcp每传送一个信息包都会传送一个序号,接收方会检查这个序号,确保收到该信息包,并把全部信息包按照顺序重新合并,同时,如果接收方看到了一个已经看过的序号,则该信息包就会被丢弃。

5.tcp全双工

TCP连接是全双工的,就是使用了两条通信的线路,所以在关闭的时候,通信双方都进行单独的关闭连接。

6.tcp连接的三次握手

image
来回共三次握手,完成连接。

7.tcp断开的四次挥手

image

问题

1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的.
简单的说就是,连接的时候只要接收到同意就连接。断开的话不是这样,对方同意了也关闭了发数据到我方的线路,但因为tcp是==全双工==的。即接收方方还可以收到数据,发送发可能还有一些数据没发完。发完后再发一个ack断开和对方的连接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章