TCP / UDP 프로토콜
TCP/IP 에서의 전송 계층에 해당하는 프로토콜들이며, 전송계층의 프로토콜들은 process-to-process protocol
이다.
IP 프로토콜의 경우
host-to-host protocol
UDP (User DataGram Protocol)
- 비연결성과 비신뢰성
- 기본적인 IP 데이터 전달 서비스에 프로세스간 통신이 추가된 형태
- 연결성 보장과 신뢰적 전송에 소요되는 오버헤드가 없음
- 응용 계층에서 데이터를 처리해줄때 오버헤드가 발생할 수도 있음
- 간단한 메시지를 송수신할 때 유리
특징
- 비연결형 IP 전달 서비스 + 검사합(checksum) 기능
- 최종 목적지의 데이터 수신 여부를 확인하지 않음 (데이터 손실 가능성 O)
- 메시지의 도착 순서를 재조정하지 않음 (데이터 순서 틀릴 가능성 O)
- 호스트 사이에 데이터 흐름 제어 없음 (수신자 처리 용량을 초과하는 데이터 발생 가능)
장단점
- 장점 : TCP보다 데이터 전송속도가 빠르고 응용 프로그램이 간단해짐
- 단점 : UDP를 사용하는 응용 프로그램은 메시지 손실, 중복 수신, 수신 지연, 잘못된 순서 등을 처리하기 위한 신뢰성 제어 기능을 제공해야함
UDP 사용자 데이터그램
가짜 헤더 부분 (pseudo header)
- 발신지 IP 주소 (32 bit)
- 목적지 IP 주소 (32 bit)
- 제로바이트 (8 bit)
- 프로토콜 타입 (8 bit)
- 헤더 길이 (16 bit)
UDP 헤더 부분
- 발신지 포트(16 bit)
- 목적지 포트(16 bit)
- 데이터그램 전체 길이(16 bit) (=헤더 길이 + 데이터 길이)
- UDP 검사합(16 bit) : 데이터그램 전체의 오류 검사용
데이터 부분
Process-to-process 통신
포트번호를 통해서 Process-to-process를 연결해준다.
- 포트 번호
- 서버 프로세스는 잘 알려진 포트 번호 사용
- 클라이언트 프로세스는 임시 포트 번호 사용
TCP (Transmission Control Protocol)
- 연결지향(connected-oriented) 전송 서비스 (연결 설정 - 데이터 전송 - 연결 해제)
- 신뢰성 (흐름제어, 오류제어)
- 방대한 양의 데이터 전송할때 주로 사용
신뢰성 제공 방법
- 연결지향 데이터 전송
- Segment 단위의 전송 (MSS: Maximum Segment Size)
- 흐름 제어 (flow control: sliding window 사용)
TCP 세그먼트 형식
- 발신지 포트 (16 bit)
- 목적지 포트 (16 bit)
- 순서 번호 (32 bit) : 데이터 필드 첫 번째 데이터 바이트의 순서 번호
- 응답 번호 (ACK number) (32 bit)
- 송신측으로부터 받은 세그먼트에 대한 응답
- 바로 다음에 받기를 기대하는 순서 번호를 의미함
- 헤더 길이 (4 bit) : 5 ~ 15 사이의 값 (20바이트 ~ 60바이트)
- 예약 (6 bit)
- 제어 (6 bit)
- URG : 긴급 포인터(urgent pointer) 필드가 유효함을 표시함
- ACK : 응답번호가 유효함을 표시함
- PSH : 가능한 빨리 현재 세그먼트를 상위 계층에 전달해야함
- RST : 연결을 재설정함
- SYN : 연결을 초기화하기 위해 순서번호를 동기화시킴
- FIN : 연결을 해제시키기 위해 현재 세그먼트가 마지막 데이터임을 표시함
- 윈도우 크기 (16 bit) : 흐름제어를 위한 윈도우의 크기를 명시 (최대 크기 = 2^16 byte)
- 검사합 (16 bit) : 오류제어를 위한 검사합 부분
- 긴급 포인터 (16 bit) : URG flag = 1일 때, 긴급 데이터의 마지막 바이트의 순서 번호 = 긴급포인터 + 순서 번호
- 옵션 (option: 0 ~ 40 byte)
- Maximum Segment Size (MSS)
- 윈도우 크기를 증가시키기 위한 값
- time stamp 등
TCP 연결형 서비스
TCP 종점(endpoint) 식별자 (=socket address)
- 호스트 IP 주소와 포트 번호로 정의
- 전이중(full-duplex) 데이터 전송 서비스
TCP 연결 설정
- 3-way handshaking
- 송신측에서 보낸 SYN을 보낸다.
- 수신측에서는 받은 SYN에 1을 더하여 ACK 값을 결정하고 수신측만의 SYN을 생성하여 보낸다.
- 송신측에서 받은 데이터의 ACK값이 처음에보낸 SYN에 1을 더한 값이면 데이터 전송이 제대로 이루어진거라고 검증이 된 것이다. 수신측에게 데이터를 제대로 받았다고 전달하기 위해서 수신측에서 보낸 SYN 값에 1을 더해서 ACK에 담아 보낸다.
초기 순서번호(ISN: Initial Sequence Number)를 정하는 방법은?
- 난수 발생기
- 양 방향이 서로 다른 ISN을 사용함
TCP 연결 종료
- 송신측에서
FIN seq = x(random number)
를 보냄 - 수신측에서 FIN+1한값을 ACK에 담고 수신측만의 FIN 또한 담아서 보냄
- 송신측은 ACK를 검증하고 수신측에게 FIN+1의 값을 ACK에 담아서 보냄
- 수신측에서 ACK를 검증하고 검증이 성공적으로 됐으면 통신 종료