이번 주차에는 TCP와 UDP에 대해 정리해 봤다.
인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜을 말한다.
TCP는 애플리케이션에게 신뢰적이고 연결지향성 서비스를 제공한다.
따라서, 서버와 클라이언트간에 데이터를 신뢰성 있게 전달하기 위해 만들어진 프로토콜이다.
그리고 TCP는 장치들 사이에 논리적인 접속을 성립하기 위해서 3-way handshake를 사용한다.
1.연결형서비스로 가상 회선 방식을 제공
2.흐름 제어(Flow control)
3.혼잡 제어(Congestion control)
4.높은 신뢰성을 보장
5.전이중(Full-Duplex), 점대점(Point to Point)방식
TCP는 여러 개의 필드로 나누어진 20 bytes
, 즉 160 bits
의 헤더를 사용하며, 각 필드의 비트를 0 또는 1로 변경하여 전송하고자 하는 세그먼트의 정보를 나타낸다.
하지만 이 20 bytes
라는 것은 아무 옵션도 없는 기본적인 헤더일 때의 용량이고, TCP의 여러가지 옵션들을 사용하면 헤더 맨 뒤에 옵션 필드들이 추가로 붙기 때문에 최대 40 bytes
가 더해진 60 bytes
까지도 사용할 수도 있다.
IP 주소
와 포트 번호
가 필요하다.순서번호 필드
(전송하는 데이터의 순서를 의미)필드 | 의미 |
---|---|
URG | Urgent Pointer(긴급 포인터) 필드에 값이 채워져있음을 알리는 플래그. 이 포인터가 가리키는 긴급한 데이터는 높게 처리되어 먼저 처리된다. 요즘에는 많이 사용되지 않는다. |
ACK | Acknowledgment(확인 응답) 필드에 값이 채워져있음을 알리는 플래그. 이 플래그가 0이라면 승인 번호 필드 자체가 무시된다. |
PHS | Push 플래그. 수신 측에게 이 데이터를 최대한 빠르게 응용프로그램에게 전달해달라는 플래그이다. 이 플래그가 0이라면 수신 측은 자신의 버퍼가 다 채워질 때까지 기다린다. 즉, 이 플래그가 1이라면 이 세그먼트 이후에 더 이상 연결된 세그먼트가 없음을 의미하기도 한다. |
RST | Reset 플래그. 이미 연결이 확립되어 ESTABLISHED 상태인 상대방에게 연결을 강제로 리셋해달라는 요청의 의미이다. |
SYN | Synchronize 플래그. 상대방과 연결을 생성할 때, 시퀀스 번호의 동기화를 맞추기 위한 세그먼트임을 의미한다. |
FIN | Finish 플래그. 상대방과 연결을 종료하고 싶다는 요청인 세그먼트임을 의미한다. |
오류를 검출
하기 위한 값TCP/IP 프로토콜을 이용해서 통신을 하는
응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정
SYN
를 보내고 SYN_SENT
상태로 대기한다.SYN-RECEIVED
상태로 바꾸고 SYN
과 응답 ACK
를 보낸다.SYN
과 응답 ACK
를 받은 클라이언트는 ESTABLISHED
상태로 변경하고 서버에게 응답 ACK를 보낸다.ACK
를 받은 서버는 ESTABLISHED
상태로 변경한다.상태 | 설명 |
---|---|
CLOSED | 연결 수립을 시작하기 전의 기본 상태(연결 없음) |
LISTEN | 포트가 열린 상태로 연결 요청 대기 중 |
SYN-SENT | SYN을 요청한 상태 |
SYN-RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 중 |
ESTABLISHED | 연결 수입리 완료된 상태, 서로 데이터를 교환할 수 있다. |
3way handshake가 연결확립을 위해 진행했다면 4way handshake는 세션을 종료하기 위해 수행되는 절차를 말한다.
FIN
을 보내고 FIN-WAIT-1
상태로 대기한다.CLOSE-WAIT
으로 바꾸고 응답 ACK
를 전달한다. 동시에 해당 포트에 연결되어 있는 애플리케이션에게 close를 요청한다.ACK
를 받은 클라이언트는 상태를 FIN-WAIT-2
로 변경한다.FIN
을 클라이언트로 보내 LAST_ACK
상태로 바꾼다.FIN
을 받은 클라이언트는 ACK
를 서버에 다시 전송하고 TIME-WAIT
으로 상태를 바꾼다.상태 | 설명 |
---|---|
ESTABLISHED | 연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
FIN-WAIT-1 | 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다. |
FIN-WAIT-2 | 자신이 보낸 FIN에 대한 ACK를 받았고, 상대방의 FIN을 기다린다. |
CLOSE-WAIT | 상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 어플리케이션에 종료를 알린다. |
LAST-ACK | COLSE-WAIT 상태를 처리 후 자신의 FIN 요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태. |
TIME-WAIT | 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 기다린 후 CLOSED로 전이 한다. |
CLOSED | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
TCP는 신뢰성 있는 연결이기 때문에 데이터를 확실하게 주고받아야 한다.
sender은 receiver에게 요청을 보낸 후 receiver으로부터 ACK를 기다리는데, ACK를 받지 못하게 된다면 패킷이 중간에 손실되었다고 판단하고 요청을 재전송한다.
이렇게 요청을 재전송하는 것을 TCP 재전송이라 한다.
재전송 상황으로는 타임아웃과 중복응답이 있다.
연결 과정이 없기 때문에 TCP 보다 빠른 전송이 가능하지만, 데이터가 유실될 수 있고,
데이터 패킷을 순차적으로 보내더라도 먼저 보낸 패킷이 느린 선로를 통해 전송될 경우 나중에 보낸 패킷보다 늦게 수신될 수 있다.
UDP는 전송계층의 비연결 지향적 프로토콜을 뜻한다.
※비연결 지향적이란 데이터를 주고받을 때 연결 절차를 거치지 않고 발신자가 일방적으로 데이터를 발신하는 방식을 의미한다.
상태 | 설명 |
---|---|
Source Port | 송신지의 Port번호 |
Destination Port | 목적지의 Port번호 |
Total Length | 헤더를 포함한 전체 데이터그램의 크기를 의미하는 필드 |
Checksum | 데이터그램의 오류를 확인하기 위한 필드 |
UDP TCP의 체크섬 필드에서의 차이점
TCP 체크섬은 세그먼트 데이터 송신 시도 중에 발생될 비트의 오류를 검출해야 하기에필수
적이지만,
UDP 체크섬은 송신 측에서 체크섬 값을 전부 Zero(0)로 송출하면 수신 측은 체크섬을 하지 않아도 되는선택
사항이다.(옵션으로 사용)
https://evan-moon.github.io/2019/11/10/header-of-tcp/
https://dev-coco.tistory.com/144