##전송 제어 프로토콜
- TCP는 연결지향적인 신뢰성 있는 프로토콜이다
- 연결지향적 >> 연결설정, 데이터 전송, 연결 해제 단계 정의
- 신뢰성 >> GBN, SR프로토콜 조합 사용
- 가장 일반적인 프로토콜
##TCP Services
- 포트번호를 이용하여 프로세스 대 프로세스 통신
- 스트림 전송 서비스
- TCP에서 송신 프로세스는 바이트 스트림 형태로 데이터를 전송
- 두 개의 프로세스가 가상의 "튜브"로 연결
- 송신 버퍼와 수신 버퍼
- 필요한 이유? 송신 및 수신 프로세스가 동일한 속도로 데이터를 생성하거나 소비하지 않을 수 있기때문
- 각 방향마다 송신 버퍼와 수신 버퍼의 두 개의 버퍼 존재
- TCP 세그먼트
- IP는 바이트 스트림의 형태가 아닌 패킷의 형태로 데이터를 전달
- TCP는 일련의 바이트를 세그먼트라고 하는 패킷으로 그룹화
- TCP는 각각의 세그먼트에 헤더를 붙이고, IP계층에 세그먼트를 전송 >> 캡슐화되어 전송
- 사진
- 전이중 통신
- 다중화와 역다중화
- 송신측에서 다중화를 수행, 수신측에서 역다중화 수행 (UDP와 같음)
- 연결 지향이므로 프로세스간에 연결이 설정되어 있어야 함 (UDP와 다름)
- 연결 지향 서비스
- 1단계 : 두 TCP간의 가상 연결 설정
- 2단계 : 양방향으로 데이터 교환
- 3단계 : 연결 종료
- 신뢰성 있는 서비스
##TCP의 특징
번호화 시스템
- 바이트 번호
- TCP는 한 연결에서 전송되는 모든 데이터 바이트에 번호를 매김
- 각 방향(송신-수신)에서 독립적으로 매겨짐
- TCP는 0에서 2^32-1 사이의 임의 값을 선택하여 이를 처음 바이트 번호로 설정
- 임의 값이 1,057, 총 데이터 6,000바이트이면 1,057 ~ 7,056까지의 번호 매겨짐
- 순서번호
- 바이트 번호가 매겨지면, 전송하고자 하는 세그먼트에 하나의 순서번호를 할당
- 각 방향에서 순서 번호의 정의
- 확인응답 번호
- TCP는 양방향이므로, 연결 설정되면 양측에서 동시에 데이터를 송수신
- 각 방향으로 전송되는 세그먼트에 있는 순서 번호는 그 세그먼트에의해 운반되는 첫 번째 바이트의 번호
- 각 TCP는 자신이 바이트를 수신하였다는 것을 확인하기 위해 확인응답 번호를 전송 -> 확인응답 번호는 자신이 수신하기를 기대하는다음 바이트의 번호
- 확인응답 번호는 누적(cumulative)
- 한쪽 편에서는 수신 성공한 마지막 바이트의 번호에 1을 더한 값을 확인응답 번호로 전송
##Segment
세그먼트(Segment) : TCP에서의 패킷
-
형식
- 제어
- URG, ACK, PSH, RST, SYN, FIN
- 검사합
- UDP와 동일하게 의사헤더가 검사합 계산을 위해 세그먼트에 추가됨
-
검사합(Checksum)이란?
##TCP연결
- 연결지향 전송 프로토콜 > 발신지와 목적지 간의 가상경로를 설정
- 손상, 손실된 프레임의 재전송과 확인응답 등의 처리 가능
#연결설정
- 연결이 되면 통신이 시작
- 데이터 교환 전 한편에서는 통신을 개시하고,
- 다른 편에서는 개시에 대한 승인이 이루어져야 함
**3단계 핸드쉐이킹 절차
: TCP에서의 연결 설정은 3단계 핸드쉐이킹(Three-way handshaking)이라고 함
- 1단계
- 클라이언트는 첫 번째 세그먼트로서 SYN 플래그가 1로 설정된 SYN 세그먼트를 전송(동기화가 목적)
- 클라이언트는 임의의 값을 첫 번째 순서 번호로 전송(ISN: 초기 순서 번호)
- 이 세그먼트에는 확인응답 번호(ACK)가 포함되지 않음
- 윈도우 크기도 정의하지 않음(윈도우 크기는 세그먼트가 확인응답 번호를 포함하는 경우에만 의미)
- 즉, SYN 세그먼트는 단지 하나의 제어 세그먼트이며, 어떠한 데이터도 전달하지 않음
SYN 세그먼트는 데이터 전달X, 하나의 순서번호를 소비
- 2단계
- 서버는 두 번째 세그먼트로서 SYN과 ACK 플래그 비트가 각각 1로 설정된 SYN+ACK 세그먼트를 전송
- 세그먼트는 반대 방향으로의 통신을 위한 SYN 세그먼트임
- 서버->클라이언트로 전송되는 바이트의 순서화를 위한 순서 번호를 초기화하기 위해 사용
- 서버는 ACK 플래그를 1로 설정하고 클라이언트로부터 수신하기를 기대하는 다음 순서 번호를 표시함으로써 클라이언트로부터의 SYN 세그먼트 수신을 확인응답
- 이 세그먼트는 SYN 세그먼트의 역할을 수행하기 때문에 하나의 순서 번호를 소비
SYN + ACK 세그먼트는 데이터를 전달하지는 않지만 하나의 순서번호를 소비
- 3단계
- 클라이언트는 세 번째 세그먼트를 전송(단순 ACK 세그먼트)
- ACK 플래그와 확인응답 번호 필드를 이용하여 두 번째 세그먼트의 수신을 확인
- 이 세그먼트에 있는 순서 번호는 SYN 세그먼트에 있는 것과 동일한 값으로 설정(ACK 세그먼트는 어떠한 순서 번호도 소비하지 않음)
- 클라이언트는 서버의 윈도우 크기를 결정해야 함
ACK 세그먼트는 데이터를 전달하지 않는 경우에는 순서번호를 소비하지 않는다.
#데이터 전송
- 연결이 설정된 후에는 양방향으로 데이터가 전송될 수 있음
- 동일한 방향으로 전송되는 데이터와 확인응답은 하나의 세그먼트로 전달
- 확인응답에 데이터가 피기백(piggyback) 됨
#푸싱 데이터
#긴급 데이터
#연결 종료