网络协议 TCP连接的建立和释放
2016-1-24 0:0:0 wondial网络协议 TCP连接的建立和释放
网络协议 TCP连接的建立和释放转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883
先看TCP报文段的格式,如下;
TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项。因此TCP报文段的最小长度为20个字节。
首部固定部分的各字段的意义如下:
1、源端口和目的端口:加上IP首部的源IP地址和目的IP地址,确定唯一的一个TCP连接。另外通过目的端口来决定TCP将数据报交付于那个应用程序,从而实现TCP的分用功能。
2、序号:占4个字节,序号的范围为[0,4284967296]。由于TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,首部中的序号字段则是指本报文段所发送的数据的第一个字节的序号。另外,序号是循环使用的,当序号增加到最大值时,下一个序号就又回到了0。
3、确认号:当ACK标志位为1时有效,表示期望收到的下一个报文段的第一个数据字节的序号。确认号为N,则表明到序号N-1为止的所有数据字节都已经被正确地接收到了。
4、头部长度:TCP报文段的头部长度,它指出TCP报文段的数据部分的起始位置与TCP报文段的起始位置的距离。头部长度占4个字节,但它的单位是32位字,即以4字节为计算单位,因此头部长度的最大值为15*4=60个字节,这就意味着选项的长度不超过40个字节。
5、保留位:必须为0.
6、下面的六个控制位说明报文段的性质:
1)URG:与首部中的紧急指针字段配合使用。URG为1时,表明紧急指针字段有效,发送应用进程告诉发送方的TCP有紧急数据穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq0q8vNo6zT2srHt6LLzbe9VENQvs2w0b30vLHK/b7dsuXI67W9sb6xqM7Ets7K/b7dtcTX7seww+ajrLb4xuS688PmyNTKx8bVzajK/b7doaM8L3A+PHA+ICAgIDKjqUFDS6O6vfa1sUFDSz0xyrHIt8jPusXX1rbOssXT0NCno6y1sUFDSz0wyrGjrMi3yM+6xc7e0Keho1RDULnmtqijrNTaway9072owaK688v509C1xLSry82xqM7Ets62vLHY0Ouw0UFDS9bDMaGjPC9wPjxwPiAgICAzo6lQU0ijusjnufu3osvNtcSxqM7Ets7W0FBTSM6qMaOs1PK908rVt72908rctb24w7GozsS2zrrzo6zWsb3TvavG5L27uLa4+NOm08O9+LPMo6y2+LK71Nm1yLT91fu49ru6tOa2vMzuwvq689TZz/LJz727uLahozwvcD48cD4gICAgNKOpUlNUo7pSU1Q9Mcqxo6yx7cP3VENQway909bQs/bP1tHP1tiy7rTto6yx2NDrys23xcGsvdOjrMi7uvPW2NDCvajBotTLyuTBrL3ToaM8L3A+PHA+ICAgIDWjqVNZTqO6zayyvdDyusWjrNPDwLS3osbw0ru49sGsvdOho7WxU1lOPTG2+EFDSz0wyrGjrLHtw/fV4srH0ru49sGsvdPH68fzsajOxLbOo6zI9LbUt73NrNLivajBosGsvdOjrNTy06bU2s/s06a1xLGozsS2ztbQyrlTWU49MbrNQUNLPTGhozwvcD48cD4gICAgNqOpRklOo7rTw8C0ys23xdK7uPbBrL3ToaO1sUZJTj0xyrGjrLHtw/e0y7GozsS2zrXEt6LLzbe9tcTK/b7d0tG3osvNzeqxz6OssqLSqsfzys23xcGsvdOhozwvcD48cD4gICAgN6GitLC/2qO6vdPK1be9yMO3osvNt73PwrTOt6LLzbGozsS2zsqxyejWw7XEt6LLzbSwv9q1xLTz0KGhozwvcD48cD4gICAgOKGi0KPR6brNo7rQo9HptcTX1rbOt7bOp7D8wKjK17K/us3K/b7d1eLBvbK/t9ahozwvcD48cD4gICAgOaGivfS8sda41eujur30vLHWuNXrtbFVUkc9McqxssXT0NCno6zL/Na4s/axvrGozsS2ztbQtcS99Lyxyv2+3bXE19a92sr9oaPWtbXD16LS4rXEysejrLy0yrm0sL/azqowyrGjrNKyv8m3osvNvfS8scr9vt2hozwvcD48cD4gICAgMTChotGhz+7T68zus+SjutGhz+7TprjDzqo019a92rXE1fvK/bG2o6y38dTy08MwzO6z5KGj1+6zo7z7tcS/ydGh19a2zsrH1+6zpLGozsS089ChTVNTo6hNYXhpbXVtIFNlZ21lbnQgU2l6ZaOpo6zDv7j2way907e9zaizo7a81NrNqNDFtcS12tK7uPaxqM7Ets7W0Na4w/fV4rj20aHP7qGjy/zWuMP3sb62y8v5xNy908rVtcTX7rTzs6S2yLXEsajOxLbOoaO4w9Ghz+7I57n7srvJ6NbDo6zErMjPzqo1MzajqDIwKzIwKzUzNj01NzbX1r3atcRJUMr9vt2xqKOpo6zG5NbQaXDK17K/us10Y3DK17K/uPcyMLj219a92qOstvhpbnRlcm5ldCDJz7Hq17y1xE1UVSCjqNfu0KGjqc6qNTc2QqGjICA8L3A+PHA+PGJyIC8+PC9wPjxwPjwvcD48aDM+VENQway907XEvajBojwvaDM+PHA+PC9wPjxwPiAgICDPws28zqpUQ1DI/bTOztXK1sGsvdO1xL2owaK5/bPMo7o8L3A+PHA+PGltZyBzcmM9"http://www.it165.net/uploadfile/files/2014/0609/20140609173113385.jpg" alt="\" />
服务端的TCP进程先创建传输控制块TCB,准备接受客户端进程的连接请求,然后服务端进程处于LISTEN状态,等待客户端的连接请求,如有,则作出响应。
1、客户端的TCP进程也首先创建传输控制模块TCB,然后向B发出连接请求报文段,该报文段首部中的SYN=1,ACK=0,同时选择一个初始序号seq=i。TCP规定,SYN=1的报文段不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN—SENT(同步已发送)状态,这是TCP连接的第一次握手。
2、服务端收到客户端发来的请求报文后,如果同意建立连接,则向客户端发送确认。确认报文中的SYN=1,ACK=1,确认号ack=i+1,同时为自己选择一个初始序号seq=j。同样该报文段也是SYN=1的报文段,不能携带数据,但同样要消耗掉一个序号。这时,TCP服务端进入SYN—RCVD(同步收到)状态,这是TCP连接的第二次握手。
3、TCP客户端进程收到服务端进程的确认后,还要向服务端给出确认。确认报文段的ACK=1,确认号ack=j+1,而自己的序号为seq=i+1。TCP的标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,因此,如果不携带数据,则下一个报文段的序号仍为seq=i+1。这时,TCP连接已经建立,客户端进入ESTABLISHED(已建立连接)状态。这是TCP连接的第三次握手,可以看出第三次握手客户端已经可以发送携带数据的报文段了。
当服务端收到确认后,也进入ESTABLISHED(已建立连接)状态。
双方同时主动连接的TCP连接建立过程
正常情况下,传输连接都是由一方主动发起的,但也有可能双方同时主动发起连接,此时就会发生连接碰撞,最终只有一个连接能够建立起来。因为所有连接都是由它们的端点进行标识的。如果第一个连接请求建立起一个由套接字(x,y)标识的连接,而第二个连接也建立了这样一个连接,那么在TCP实体内部只有一个套接字表项。
当出现同时发出连接请求时,则两端几乎在同时发送一个SYN字段置1的数据段,并进入SYN_SENT状态。当每一端收到SYN数据段时,状态变为SYN_RCVD,同时它们都再发送SYN字段置1,ACK字段置1的数据段,对收到的SYN数据段进行确认。当双方都收到对方的SYN+ACK数据段后,便都进入ESTABLISHED状态。图10-39显示了这种同时发起连接的连接过程,但最终建立的是一个TCP连接,而不是两个,这点要特别注意。
数据传输结束后,通信的双方都可以释放连接,并停止发送数据。假设现在客户端和服务端都处于ESTABLISHED状态。
1、客户端A的TCP进程先向服务端发出连接释放报文段,并停止发送数据,主动关闭TCP连接。释放连接报文段中FIN=1,序号为seq=u,该序号等于前面已经传送过去的数据的最后一个字节的序号加1。这时,A进入FIN—WAIT-1(终止等待1)状态,等待B的确认。TCP规定,FIN报文段即使不携带数据,也要消耗掉一个序号。这是TCP连接释放的第一次挥手。
2、B收到连接释放报文段后即发出确认释放连接的报文段,该报文段中,ACK=1,确认号为ack=u+1,其自己的序号为v,该序号等于B前面已经传送过的数据的最后一个字节的序号加1。然后B进入CLOSE—WAIT(关闭等待)状态,此时TCP服务器进程应该通知上层的应用进程,因而A到B这个方向的连接就释放了,这时TCP处于半关闭状态,即A已经没有数据要发了,但B若发送数据,A仍要接受,也就是说从B到A这个方向的连接并没有关闭,这个状态可能会持续一些时间。这是TCP连接释放的第二次挥手。
3、A收到B的确认后,就进入了FIN—WAIT(终止等待2)状态,等待B发出连接释放报文段,如果B已经没有要向A发送的数据了,其应用进程就通知TCP释放连接。这时B发出的链接释放报文段中,FIN=1,确认号还必须重复上次已发送过的确认号,即ack=u+1,序号seq=w,因为在半关闭状态B可能又发送了一些数据,因此该序号为半关闭状态发送的数据的最后一个字节的序号加1。这时B进入LAST—ACK(最后确认)状态,等待A的确认,这是TCP连接的第三次挥手。
4、A收到B的连接释放请求后,必须对此发出确认。确认报文段中,ACK=1,确认号ack=w+1,而自己的序号seq=u+1,而后进入TIME—WAIT(时间等待)状态。这时候,TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态,时间MSL叫做最长报文寿命,RFC建议设为2分钟,因此从A进入TIME—WAIT状态后,要经过4分钟才能进入到CLOSED状态,而B只要收到了A的确认后,就进入了CLOSED状态。二者都进入CLOSED状态后,连接就完全释放了,这是TCP连接的第四次挥手。
双方主动关闭的TCP连接释放流程
与可以双方同时建立TCP传输连接一样,TCP传输连接关闭也可以由双方同时主动进行(正常情况下都是由一方发送第一个FIN数据段进行主动连接关闭,另一方被动接受连接关闭)
当两端对应的网络应用层进程同时调用CLOSE原语,发送FIN数据段执行关闭命令时,两端均从ESTABLISHED状态转变为FIN WAIT 1状态。任意一方收到对端发来的FIN数据段后,其状态均由FIN WAIT 1转变到CLOSING状态,并发送最后的ACK数据段。当收到最后的ACK数据段后,状态转变化TIME_WAIT,在等待2MSL后进入到CLOSED状态,最终释放整个TCP传输连接。
为什么A在TIME—WAIT状态必须等待2MSL时间呢?
1、为了保证A发送的最后一个ACK报文段能够到达B。该ACK报文段很有可能丢失,因而使处于在LIST—ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B可能会重传这个FIN+ACK报文段,而A就在这2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入CLOSED状态。如果A在TIME—WAIT状态不等待一段时间就直接释放连接,到CLOSED状态,那么久无法收到B重传的FIN+ACK报文段,也就不会再发送一次确认ACK报文段,B就无法正常进入CLOSED状态。2、防止已失效的请求连接出现在本连接中。A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段多从网络中消失,这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
如果您的问题还没有解决,可以到 T+搜索>>上找一下答案
相关阅读
- 用友T3用友通系统重装后,没有账套备份,如何恢复账套2019-4-29 8:0:0
- 明细账权限设置时提示“没有操作员”?2019-4-29 8:0:0
- 用友T3用友通凭证及明细帐打印出错2019-4-23 8:0:0
- 用友T3用友通凭证删除问题2019-4-23 8:0:0
- 用友T3用友通其他出入库单据的对方科目如何设置2019-4-23 8:0:0
- 用友T3用友通其他业务成本在科目余额表中无数据,在明细账中可以查到2019-4-23 8:0:0
- 用友T3用友通关于销售模块中发货单生成发票时存在的问题或需求?2019-4-23 8:0:0
- 用友T3用友通关于销售开票如何能只开金额不开明细2019-4-23 8:0:0
- 用友T3用友通关于银行代发的表样设置2019-4-23 8:0:0
- 用友T3用友通关于采购订单的执行问题?2019-4-23 8:0:0
最新信息

U8.50资产负债表中“未分配利润”与利润表中的不一致U8.50资产负债表中“未分配利润”与利润表中的不一致
U8.50-资产负债表中“未分配利润”与利润表中的不一致
自动编号: | 6545 | 产品版本: | U8.50 |
产品模块: | UFO报表 | 所属行业: | 通用 |
适用产品: | U850 | 关 键 字: | 报表 |
问题名称: | 资产负债表中“未分配利润”与利润表中的不一致 | ||
问题现象: | 资产负债表中“未分配利润”与利润表中的不一致 | ||
原因分析: | 到年底才结转利润操作,但在资产负债表中要求每个月算出未分配利润;并且损益类科目的凭证出过反方向 | ||
解决方案: | 修改利润表公式,利用表间取数算出资产负债表中的“未分配利润”取数公式格式:"e:\新建文件夹\报表\2005\利润表.rep"->d5 Relation 年 with "e:\新建文件夹\报表\2005\利润表.rep"->年+1,月 with "e:\新建文件夹\报表\2005\利润表.rep"->月 温馨提示:如果您的问题还没有解决,欢迎进入用友云基地。 |