前段时间学习OSI网络模型感觉自己懂了其实,还很浅显这两条想深入的学习一下就把自己的心的写在这里,供大家参考指正。
前言
TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。就这点与无连接协议如UDP不同,UDP向一端发送数据报时,无需任何握手。
一、TCP报文段的内容
TCP数据报文外边是包裹的网络层IP协议的报文如下图
IP首部就是目的和源的IP地址什么的这里就先不研究了重点是这个TCP首部数据格式如下。如果不计任选字段通常是20个字节。
序号:Seq序号,占32位用来标识TCP源端向目的端发送的字节流,发起方发送数据是对此进行标记。
确认序号:ack序号,只有ACK标志位为1时,确认序号段才有效,ack=Seq+1
标志位有6个:
?URG:紧急指针有效
?ACK:确认序号有效
?PSH:接收方应该尽快将这个报文交给应用层处理
?RST:重置链接
?SYN:发起一个新连接
?FIN:释放一个连接
注意事项:
1)不要将确认序号ack(小写)与确认标志位ACK搞混
2)确认方ack=发起方Seq+1两端配对
二、三次握手
所谓三次握手(Three-way Handshke)就是建立TCP连接,意思就是互相要传送3个包以确定连接的建立。(在socket变成中,这一过程由客户端执行connetc来触发在C语言中使用过于bind配合)
三次握手:
1)Client将标志SYN置为1,随机产生一个值Seq=x
2)Server收到数据包由标志位SYN=1知道client请求建立连接.server将标志位SYN和ACK都置为1之后ack=x+1,随机产生一个seq=y。并将数据发送给client确认请求
3)Client收到确认后检查ack是否为x+1。ACK是否为1.如果正确侧将ACK置为1然后ack=y+1。将数据发送给server。Server检查ack是否为y+1。ACK是否为1如果正确则连接建立成功。
三、四次挥手
由于TCP连接是全双工的,因此每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方的连接,收到FIN只是意味着这一方向上没有数据流动了,即不会在收到数据但是这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭而另一方则执行被动关闭。
1)client发送一个FIN,用来关闭client到server的数据传送,
2)Server收到一FIN后,发送一个ACK给client,确认序号为收到序号+1(与SYN一样,一个FIN占用一个序号),
3)Server发送一个FIN用来关闭server到client的数据传送
4)Client收到FIN后发送一个ACK给server确认序号为收到序号+1
完成了四次挥手告别
原文地址:http://blog.51cto.com/13638458/2113045