전송 계층은 송신자와 수신자를 연결하는 통신 서비스를 제공하며 연결 지향 데이터 스트림 지원, 신뢰성, 흐름 제어를 제공할 수 있으며 애플리케이션과 인터넷 계층 사이의 데이터가 전달될 때 중계 역할을 한다.
TCP : 패킷 사이의 순서를 보장하고 연결지향 프로토콜을 사용해서 연결을 하여 신뢰성을 구축해서 수신 여부를 확인하며 '가상회선 패킷 교환 방식'을 사용한다.
UDP : 순서를 보장하지 않고 수신 여부를 확인하지 않으며 단순히 데이터만 주는 '데이터그램 패킷 교환 방식'을 사용한다.
목적 : TCP 연결 성립 과정 - 신뢰성 확보
클라이언트와 서버 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장함
1. 🏳️ SYN 단계 : 클라이언트 -> 서버에게 접속 요청, ISN을 담아 SYN을 보낸다.
(참고) ISN : 새로운 TCP 연결의 첫번째 패킷에 할당된 임의의 시퀀스 번호
2. 🏳️ SYN+ACK 단계 : 서버 -> 클라이언트에게 응답, 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 보내며 승인번호로 클라이언트의 ISN+1을 보낸다.
3. 🏳️ ACK 단계 : 클라이언트는 서버의 ISN+1한 값인 승인번호를 담아 ACK를 서버에 보낸다.
(tmi) 공부를 하면서 SYN과 ACK를 플래그라고 하는 것을 알게되었는데.. 뭐랄까 너무 귀여웠다 마치 클라이언트가 깃발을 저 멀리서 흔들며 나 !! 접속하게 해줘어어!!(SYN) 하는 느낌🤭 마찬가지로 ACK도 서버가 그래 접속해~!~ (펄럭펄럭) 하는 것 같아 흐뭇.. 했다 이제와서 생각해보니 흐뭇할 것 까진 없는데 참 이상하다
목적 : TCP 연결 해제 과정
1. 🏳️ FIN : 클라이언트 -> 서버에게 연결 종료 요청 송신, 클라이언트는 FIN_WAIT_1 상태로 들어간다.
2. 🏳️ ACK : 서버 -> 클라이언트에게 확인 응답, ACK는 데이터 처리가 완료되었음을 나타내고 클라이언트와의 연결이 아직 완전히 종료되지 않았음을 의미한다. 서버는 CLOSE_WAIT 상태에 들어가고 클라이언트가 세그먼트를 받으면 FIN_WAIR_2 상태에 들어간다.
3. 🏳️ FIN : 서버 -> 클라이언트에게 자신도 연결을 종료하고자 함
4. 🏳️ ACK : 클라이언트는 TIME_WAIT 상태가 되고 다시 서버로 ACK를 보내서 서버는 CLOSED 상태가 된다. 이후 클라이언트는 어느 정도의 시간을 대기한 후 연결이 닫히고 클라이언트와 서버의 모든 자원의 연결이 해제된다.
=> 왜 TIME_WAIT(소켓이 바로 소멸되지 않고 일정 시간 유지되는 상태) 상태가 될까?
첫번째, 지연 패킷이 발생할 경우를 대비하기 위함. 패킷이 뒤늦게 도달하고 이를 처리하지 못한다면 데이터 무결성 문제가 발생한다.
두번째, 두 장치가 연결이 닫혔는지 확인하기 위함. 만약 LAST_ACK 상태에서 닫히게 되면 다시 새로운 연결을 하려고 할 때 장치는 줄곧 LAST_ACK로 되어 있기 때문에 접속 오류가 나타나게 될 것이다.