Linux网络编程——TCP协议详解(一)

  • TCP的特点:面向连接的、可靠的、字节流服务

面向连接的

在传输数据之前必须建立连接(三次握手)
在传输数据之后必须断开连接(四次挥手)

三次握手

在这里插入图片描述

  • 进行三次握手的意义
  1. 保证连接能够成功建立
  2. 通过SYN(同步报文段)告诉对方将要发送的数据的报文段从何开始,从而使得通讯双方能够同步的知道将要发送的报文段的序号
四次挥手

在这里插入图片描述
MSL:报文段在网络中的最大生存时间

  • TIME_WAIT状态存在的意义
  1. 处理迟来的数据报:直接将其丢弃,防止对后续启动进程造成影响
    若FIN报文段发送速度比其他报文段快,那么直接断开后,之前发送的数据则无法处理,若此时主动断开方快速启动了一个和原来一样的程序,那么这个程序会接收到发送的数据
  2. 可靠的终止TCP连接:防止最后发送的ACK被丢弃
    若最后ACK被丢弃,则被动断开方会持续发送FIN,而主动断开方已经关闭,故被动断开方只能异常关闭
  • 如果有客户端连接到服务器上,在客户端未终止的情况下,服务器端强制关闭,在直接重启服务器程序,服务器无法正常启动
    与TIME_WAIT有关,服务器处于主动断开方,为TIME_WAIT状态

  • 四次握手的意义
    网络通讯是全双工的,即A(主动断开方)和B(被动断开方)之间有两条管道
    前两次挥手断开了 A —> B
    后两次挥手断开了 B <— A

字节流服务

在这里插入图片描述

  • 应用层
    发送端send的次数和接受端recv的次数没有必然的联系
    recv在接收数据时,不需要一次将缓冲区的数据全部读取,剩余的数据会保存在TCP接收缓冲区中

  • 内核
    发送端send的次数和内核封装的TCP报文段的个数没有必然的联系
    接收端recv的次数和接收到的TCP报文段的个数没有必然的联系

  • 数据
    发送的数据是没有明显的界限的

因为数据之间没有明显的界限,所以传输数据会有数据粘包问题
解决数据粘包的方法:

  1. 在每段数据之间加一行换行
  2. 在报头上注明所传输的数据的长度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值