TCP/IP 모델은 IP 기술을 중심으로 그 위에 TCP와 UDP라는 전송계층이 얹어진 형태입니다. 따라서 어떠한 통신 관련 하드웨어 기술이든 IP만 구현하면 되고, 어떤 응용 프로그램이든 IP 위에서만 동작하면 됩니다. 자세한 내용은 TCP/IP 모델이나 OSI 7계층으로 포스팅하도록 하겠습니다.
IP 네트워크의 두 컴퓨터 간의 연결 지향 통신을 위한 전송 계층 호스트 간 프로토콜
IP가 데이터를 한 장소에서 다른 장소로 옮겨주는 역할을 한다면, TCP는 전체 데이터가 목적지에 잘 도착할 수 있도록 데이터의 흐름을 조절하고 이를 보장합니다
가상 회선 방식을 통한 연결형 서비스를 제공합니다
3-way handshaking 과정을 통해 연결을 설정하고, 4-way handshaking 과정을 통해 연결을 해제합니다
흐름 제어 및 혼잡 제어
높은 신뢰성을 보장하지만 속도는 느리다
바이트 스트림을 통한 연결
전이중(Full-Duplex), 점대점(Point to Point) 방식
http, email, file transfer 등에 사용
서버 소켓은 연결만을 담당
처음 생성된 서버 소켓 인스턴스는 실제 통신을 담당하지 않고 클라이언트가 접속했는지의 여부만 확인합니다
실제로 통신하는 소켓은 accept() 메서드로 활성화된 소켓이며, 이 활성화된 소켓은 데이터 전송에 필요한 스트림을 생성합니다
추가적인 소켓 프로그래밍에 대한 내용은 추후 포스팅하겠습니다.
연결 과정에서 반환된 클라이언트 소켓은 데이터의 송수신에 사용되며, 연결형 서비스로는 가상회선 방식을 제공한다
서버와 클라이언트는 1대1로 연결된다
하나의 서버에 여러 컴퓨터에서 client가 접속하는 경우, 각 client 당 하나씩의 서버 소켓이 생성됩니다
예를 들어 1만개의 client가 접근할 때, 1만개의 서버 소켓이 생성되고, 1만번의 accept() 메서드가 수행되는 비효율적인 일이 발생합니다
이를 해결하기 위해 스레드가 이용됩니다
추후 소켓 프로그래밍에 대한 코드를 포스팅하도록 하겠습니다
스트림 전송으로 전송 데이터의 크기가 무제한이다
패킷에 대한 응답을 해야하므로 성능이 낮다
Streaming 서비스에 불리
Source Port, Destination Port
세그먼트의 출발지와 목적지를 나타내는 필드
각각 16 bits 할당
출발지와 목적지의 주소를 판별하기 위해서는 IP 주소와 포트 번호가 필요한데, IP 주소는 네트워크 계층에 있는 IP 헤더에 담기기 때문에 TCP 헤더에는 포트만 나타내는 필드만 존재
Sequence Number
전송하는 데이터의 순서가 기록되어 수신자는 쪼개진 세그먼트의 순서를 파악해서 올바른 순서로 데이터를 재조립할 수 있다
32 bits가 할당되므로 웬만해서는 중복되지 않는다
송신자가 최초로 데이터를 전송할 때는 이 번호를 랜덤하게 초기화하고, 이후 보낼 데이터의 1 bytes당 시퀸스 번호를 1씩 증가시켜 데이터의 순서를 표현
Acknowledgement Number
승인 번호는 수신자가 예상하는 다음 시퀸스 번호를 의미 (다음에 보내줘야 하는 데이터의 시작점)
32 bits 할당
연결 설정과 연결 해제의 handshake 과정에서는 상대방이 보낸 시퀸스 번호 + 1
이지만, 실제로 데이터를 주고 받을 때는 상대방이 보낸 시퀸스 번호 + 자신이 받은 데이터(세그먼트)의 bytes
로 승인 번호 생성
Data Offset
전체 세그먼트에서 헤더가 아닌 데이터가 시작되는 위치를 표시
32 bit word 단위를 사용하므로, 이 필드 값에 4를 곱하면 실제 데이터의 시작 위치를 알 수 있다
Data Offset은 Option 필드의 길이가 고정되어 있지 않기 때문에 반드시 필요하다
Reversed
Flags
SYN, ACK, FIN 등의 제어 번호가 담겨있다
URG : Urgent Pointer 필드에 값이 있음을 알려주는 플래그이며, 포인터가 가리키는 긴급한 데이터는 먼저 처리된다
ACK : Acknowledgement 필드에 값이 있음을 알려주는 플래그이며, 0이면 승인 번호 필드를 무시한다
PSH : Push 플래그이며, 수신측에 데이터를 최대한 빨리 응용프로그램에 전달하라는 플래그
RST : Reset 플래그이며, 이미 연결이 확립된 ESTABLISHED 상태인 상대방에게 연결을 강제로 리셋해달라는 요청
SYN : Synchronized 플래그이며, 연결을 생성할 때 시퀸스 번호의 동기화를 맞추기 위해 존재
FIN : Finish 플래그이며, 연결을 종료하고 싶다는 요청
Window Size
수신 윈도우의 버퍼 크기를 지정
0이면 송신 프로세스의 전송 중지
Checksum
Urgent Pointer
Options
TCP의 기능을 확장할 때 사용
크기가 가변적이므로 Data Offest 필드가 필요하다
추후 포스팅에서 3-way handshaking, 4-way handshaking, UDP, 소켓 프로그래밍 등에 대해 더 자세하게 알아보겠습니다
망나니개발자 님의 블로그
이대현 님의 블로그
코딩팩토리
Hackerrior 님의 블로그
Evans Library
쉽게 배우는 운영체제, 한빛 아카데미