TCP / Transmission Control Protocol
TCP는 장비들 간의 통신과정에서, 정보를 '안정적으로', '순서대로', '에러없이' 교환할 수 있도록 하는 것에 목적을 둔 프로토콜이다.
OSI레이어 모델의 존재이유: 개발자 한명이 네트워크 관련 모든 기술을 다루기 어렵기 때문에 각 레이어마다 역할분담을 하여, 어떤 작업을 할 때 신경써야 하는 범위를 좁혀주기 위함이다.
TCP가 만들어진 이유
1970년 냉전 당시 미 국방성이 개발하던 알파넷 프로젝트의 일부.
핵전쟁이 나도 살아남는 네트워크를 만들기 위해 데이터 전송시 기존의 회선교환방식(중계국 의존도 높음)이 아닌 '패킷교환방식'을 고안하였다.
=> 데이터를 쪼개서 여러 회선을 통해 분산전송 하는 방식
패킷 교환 방식의 문제점
- 전송 도중 특정 패킷이 사라지거나 훼손된 경우
=> 해당 패킷만 다시 전송 (ARQ)
- 송신측이 패킷을 쪼갠 순서를 알아야, 수신측이 재조립할 수 있음
=> 순서번호를 패킷과 함께 전송 (시퀀스 번호)
- 수신측이 처리할 수 있는 속도보다 송신측이 패킷을 빠르게 보내면 안됨
=> 수신측이 처리할 수 있는 양을 송신측에 알려주고, 그만큼만 보내게 함 (슬라이딩 윈도우)
패킷 교환 전 세션연결(동기화)
TCP 3way-handShake: TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정
SYN
SYN은 '동시에 발생하다의 약자로, 다른 컴퓨터로 전송 된 TCP 패킷으로 연결이 이루어 지도록 요청합니다. SYN이 두 번째 시스템에서 수신되면 SYN / ACK가 SYN이 요청한 주소로 다시 전송됩니다. 마지막으로, 원래 컴퓨터가 SYN / ACK를 수신하면 최종 ACK가 전송됩니다.
ACK
ACK은 '승인'의 약자로, 다른 컴퓨터 나 네트워크 장치가 다른 컴퓨터에 SYN / ACK 또는 다른 요청을 보낸 것을 확인한 응답을 나타냅니다.
TCP Header는 기본 20bytes(160bits)로, 여러개의 필드로 나뉘어 있다.
- Source Port / Destination Port
- 16bits
- 세그먼트(데이터)의 출발지와 목적지를 나타내는 필드
- IP주소는 하위계층의 IP헤더에 담기므로, Port를 나타내는 필드만 존재한다.
- Sequence Number
- 32bits (최대 4,294,967,296 까지의 수를 담을 수 있다. //이 수를 넘어가면 다시 0부터 시작)
- 전송하는 데이터의 순서를 담은 필드
- 수신자는 이 번호를 통해, 쪼개진 세그먼트의 순서를 파악하여 재조립할 수 있다.
- 송신자가 최초로 데이터를 전송할 때는 이 번호를 랜덤한 수로 초기화 함, 이후 자신이 보낼 데이터의 1bytes당 시퀀스 번호를 1씩 증가시키며 데이터의 순서를 표현한다.
- Acknowledgement Number
- = ACK
- 다음에 보내줘야(받아야) 하는 데이터의 시작점
- 연결 설정과 연결 해제 때 발생하는 핸드쉐이크 과정에서는 "상대방이 보낸 시퀀스 번호 + 1"로 자신의 승인 번호를 만들어내지만, 실제로 데이터를 주고 받을 때는 "상대방이 보낸 시퀀스 번호 + 자신이 받은 데이터의 bytes"로 승인 번호를 만들어낸다.
- Data Offset
- 전체 세그먼트 중에서 헤더가 아닌 데이터가 시작되는 위치가 어디부터인지를 표시
- 오프셋 표기시 32bits워드 단위를 사용하며, 1워드=4bytes를 의미한다. 따라서, 이 필드의 값에 4를 곱하면 세그먼트에서 헤더를 제외한 실제 데이터의 시작위치를 알 수 있다.
- Reserved
- 미래를 위해 예약된 필드, 모두 0으로 채워져야 한다.
- Flags(NS ~ FIN)
- 9개의 비트 플래그(상태알림)
- Window Size
- 한번에 전송할 수 있는 데이터의 양을 의미하는 값을 담는다.
- Checksum
- 데이터를 송신하는 중에 발생할 수 있는 오류를 검출하기 위한 값
- 전송할 데이터를 16Bits씩 나눠서 차례대로 더해가는 방법으로 생성함
- 수신측은 수신한 데이터 내용과 Checksum값을 비교하여 오류 여부를 검증한다.
- Urgent Pointer
- 긴급 포인터, URG플래그의 값이 1 이라면, 수신측은 이 포인터가 가르키고 있는 데이터를 우선 처리한다.
- Options
- TCP의 기능을 확장할 때 사용하는 필드
- 크기가 가변적이다. 따라서, 수신측이 헤더와 데이터의 범위 구분을 하려면 'Data Offset'필드를 사용해야 하는 것이다.
출처: https://evan-moon.github.io/2019/11/10/header-of-tcp/#checksum