面向连接的传输TCP(一)
这篇博客主要是对计算机网络自顶向上做的阅读笔记,深入地了解TCP
一、TCP连接
1.特点:
a.TCP是面向连接的,因为一个进程在向另一个进程进行数据传输之前必须先要握手,即要互相发送报文,以确认信息传输的参数。并且连接时双方都要初始化一些参数和状态变量
b.TCP协议只能在端系统中运行,中间路由器对TCP完全视而不见
c.TCP是全双工服务。如果A到B存在TCP连接,那么数据可以从A流向B,也可以从B流向A
d.点对点,也就是说他不能像UDP那样多播,不能从一个发送方送给多个接收方
2.TCP连接的建立
当一个主机上的进程想要与另一个主机的进程建立起连接。则发起请求的一方称为客户端,另一个就是服务端。
发起请求(python): clientServer.connect((serverName,serverPort))//ServerName标识了服务器名称,serverPort标识端口
然后客户端向服务器发送TCP报文段,服务器用另一段报文段来响应,最后客户再用三个特殊的报文段来响应。前两个报文段不承载有效数据,第三个报文段可以承载有效数据。由于发送了三个报文段,TCP连接这种过程被称为三次握手。(TCP报文段就是TCO的数据加上首部信息形成的)
3.传输数据
建立起连接之后就可以互相发送数据了,当数据到达TCP的传送门之后,TCP会把数据放到它的发送缓存中,就由TCP控制它什么时候把信息取出来。TCP从发送缓存取出数据大小受限于MSS(报文段里应用层最大数据)。MSS通常为1460字节(首部占40字节)
TCP报文段在IP中传输,会封装到IP的数据报中,然后被发送到网络中,当TCP在另一端收到这个报文段。报文段的数据就会进入TCP缓存
二、TCP的报文段

可以看出TCP报文段是由首部和数据组成的,应用数据受限于MSS,TCP发送文件,会把数据划分为几个MSS(最后一个通常小于MSS),而首部看起来信息就很多了,比起UDP来说字段就多了很多,了解报文段字段的作用,我们就能够进一步深入了解TCP能够给传输层带来什么。
1.源端口和目的端口
和UDP一样TCP也提供了多路分解和多路复用。
我们都知道传输层就是通过套接字来传递数据的,套接字是由IP+端口组成的。
多路分解就是将运输层的数据传输给正确的套接字:在源主机上从不同的套接字收集信息。
多路复用就是将信息加上首部打包好生成报文段之后传递到网络层的过程。所以TCP包含源和目的端口,这样才能保证多路分解和多路复用。
2.检验和字段
这个同UDP一样包括检验和字段。用来提供差错检测
3.序号字段和确认号字段
这两个字段是TCP报文中最重要的两个字段,使TCP能提供了可靠数据传输
序号字段:就是把数据分段,然后标序号
假如A要从B发送数据流,包含500000字节,MSS长度为1000字节,那么TCP要为这个数据构建500个报文段,并分配序号,第一个序号0,第二个序号1000,第三个序号2000。
确认号:一个主机A填充的想要下一次从主机B接收到的下一个字节的序号。因为TCP是全双工的,从A发送到B的同时也要从B接收到数据,如果意外丢包,能够通过确认号发现。
既然序号和确认号这么重要,那我们来看一个简单的案例吧。
假设客户发送了字符C,并喝起了咖啡,那么客户端和服务端之间会发生什么呢,假设初始化客户端和服务端序号42和79.
第一次握手:用户序号42(也就是该报文段数据的首字节),确认号79(也就是希望服务器应答的序号是79),数据段中包含‘C’(这是一种捎带)
第二次握手:服务器发送报文段,它有两个目的,确认他收到的数据,第二个目的回显字符'C',所以它在确认号填入43,,序号79(这是起始的序号),数据端里填入的是字符C
第三次握手:确认号80(因为79及以前的字节流已经收到),序号43,它的唯一目的就是确认已经收到服务器的数据,此时数据段没有数据
4.接收窗口字段
用于流量控制,指示接收方愿意接收到的字节
5.首部长度
由于TCP长度可变,该字段由于指示TCP报文段长度
6.选项字段
指示发送方和接收方协商的MSS
7.标识字段
ACK用于指示确认字段是有效的,RST、SYN\FIN用于连接建立和拆除。PSH被设置时,指示接收方应立即将数据交给上层,URG指示报文段中有紧急数据
面向连接的传输TCP(一)的更多相关文章
- [计算机网络-传输层] 面向连接的传输:TCP
参考:http://blog.csdn.net/macdroid/article/details/49070185 在学习TCP之前我们先来看一下可靠数据传输需要提供什么样的机制: ·差错检测机制:检 ...
- 无连接运输的UDP、可靠数据传输原理、面向连接运输的TCP
由[RFC 768]定义的UDP只是做了运输协议能够做的最少工作.除了复用/分解功能极少量的差错检测外,它几乎没有对IP增加别的东西.如果应用程序开发人员选择UDP而不是TCP,则该应用程序差不多就是 ...
- 网络传输--TCP
TCP网络编程 一.TCP简介 二.TCP网络程序--客户端 三.TCP网络程序--服务端 四.TCP知识总结 五.文件下载案例 六.3次握手和4次挥手 回到顶部 一.TCP简介TCP 1.TCP的简 ...
- 文件传输——TCP/IP协议介绍总结
一.链路层 数据链路层的工作特性: 1.为IP模块发送和接收IP数据报2.为ARP模块发送ARP请求和接收ARP应答(ARP:地址解析协议,将IP地址转换成MAC地址)3.为RARP发送RARP请求和 ...
- Java实现TCP之Echo客户端和服务端
Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- socket创建TCP服务端和客户端
看情况选择相对应的套接字*面向连接的传输--tcp协议--可靠的--流式套接字(SOCK_STREAM)*面向无连接的传输--udp协议--不可靠的--数据报套接字(SOCK_DGRAM) 在liun ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- 4-socket套接字编程
socket套接字编程 目标:根据socket模块提供的接口函数,进行组合使用完成基于tcp或者udp的网络编程. 套接字:完成上述目标的一种编程手段,编程方案. 套接字分类: 流式套接字(sock_ ...
- 网络TCp数据的传输设计(黏包处理)
//1.该片为引用别人的文章:http://www.cnblogs.com/alon/archive/2009/04/16/1437599.html 解决TCP网络传输"粘包"问题 ...
随机推荐
- C++一些函数的意义
1.重载 : C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载 2.隐藏和覆盖的区别 IF 子类的函数与父类的名称相同,但是参数不同 父类函数被隐藏(还存在) ELS ...
- JDK源码分析(10) CopyOnWriteArrayList
概述 CopyOnWriteArrayList是一个线程安全集合,原理简单说就是:在保证线程安全的前提下,牺牲掉写操作的效率来保证读操作的高效.所谓CopyOnWrite就是通过复制的方式来完成对数据 ...
- 内置装饰器二:@property
property 装饰器的作用 property 装饰器将方法包装成属性,将私有属性公有化,此属性只能被读取.相当于实现get方法的对象 class People: def __init__(self ...
- Code Chef JUMP(递推+树状数组+李超线段树)
\(JUMP\) 很容易写出转移柿子 \[f_i=\min_{p_j<p_i}\{(h_i-h_j)^2+f_j\}+w_i\] 把\(\min\)里面的东西展开一下 \[f_j=\min_{p ...
- C++类模板 template <class T>
C++在发展的后期增加了模板(template )的功能,提供了解决这类问题的途径.可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数. 比如: class Compare_int class ...
- python爬虫2——下载文件(中华网图片库下载)
# -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...
- 使用hex编码绕过主机卫士IIS版本继续注入
本文作者:非主流 测试文件的源码如下: 我们先直接加上单引号试试: http://192.168.0.20/conn.asp?id=1%27 很好,没有报错.那我们继续,and 1=1 和and 1= ...
- [underscore源码学习]——`>>` 运算符和二分查找
这是一篇记录学习 underscore v0.0.5 的fragment,觉得有点意思,和大家分享一下. 先看_.sortedIndex的源码,它用来确定 obj 在 array中的位置(array升 ...
- java中的IO流(输入流与输出流)概述与总结
Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...
- (转)教你手工mysql拆库
原文:http://www.cnblogs.com/cchust/p/3859967.html 互联网网站应用大多采用mysql作为DB存储,限于mysql单机性能的瓶颈,为了支撑更大容量和更大的访问 ...